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

Commit 626b14e4 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Fixing bottom part of QS not getting any touches in split shade

The main issue was that QS and notifications container had padding of the size of taskbar. It was because taskbar is included in window insets and container doesn't check where insets come from. If insets are coming from taskbar only they should be ignored because taskbar should disappear when shade is expanded. But if they're coming from taskabar and navigation buttons are visible, they shouldn't be ignored as then taskbar always stays on the screen - that's assessed with checking if gesture navigation is available (if not, it means button navigation). Also because buttons are on the right side only and taskbar might or might not be visible, QS is just taking full height and notifications (that are on the right) have bigger spacing from the bottom.

Because this change involved using a few extra objects not available in NotificationsQuickSettingsContainer and I wanted to avoid doing everything in NotificationPanelViewController (it's big enough) and just passing results to NotificationsQuickSettingsContainer, I introduced controller for it: NotificationsQSContainerController. Now this controller has all the logic for determining bottom spacing. There can be a few more things that can be moved from NPVC to NotificationsQSContainerController but it's a start. Also now QS views and its children views instead of talking directly to container, they talk to controller via QSContainerController interface, which is a nice side-effect improvement.

Fixes: 194989891
Fixes: 200291264
Test: Home screen (so taskbar is hidden) -> go to split shade -> use anything that is close to the bottom of QS side (music widget, rearranging QS tiles, etc)
I'll add unit tests if the change overall looks good

Change-Id: I91ab8ec26dd2ef60562ffb9fdbc0e5739745ca0b
parent c4c480ab
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@ package com.android.systemui.plugins.qs;

import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

import com.android.systemui.plugins.FragmentBase;
import com.android.systemui.plugins.annotations.DependsOn;
@@ -56,7 +55,7 @@ public interface QS extends FragmentBase {
    void setQsExpansion(float qsExpansionFraction, float headerTranslation);
    void setHeaderListening(boolean listening);
    void notifyCustomizeChanged();
    void setContainer(ViewGroup container);
    void setContainerController(QSContainerController controller);
    void setExpandClickListener(OnClickListener onClickListener);

    View getHeader();
+9 −0
Original line number Diff line number Diff line
package com.android.systemui.plugins.qs

interface QSContainerController {
    fun setCustomizerAnimating(animating: Boolean)

    fun setCustomizerShowing(showing: Boolean)

    fun setDetailShowing(showing: Boolean)
}
 No newline at end of file
+4 −17
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@ import android.graphics.Point;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.View;
import android.view.WindowInsets;
import android.widget.FrameLayout;
import android.widget.ImageView;

@@ -58,7 +57,6 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
    private int mSideMargins;
    private boolean mQsDisabled;
    private int mContentPadding = -1;
    private int mNavBarInset = 0;
    private boolean mClippingEnabled;

    public QSContainerImpl(Context context, AttributeSet attrs) {
@@ -94,25 +92,14 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
        return true;
    }

    @Override
    public WindowInsets onApplyWindowInsets(WindowInsets insets) {
        mNavBarInset = insets.getInsets(WindowInsets.Type.navigationBars()).bottom;
        mQSPanelContainer.setPaddingRelative(
                mQSPanelContainer.getPaddingStart(),
                mQSPanelContainer.getPaddingTop(),
                mQSPanelContainer.getPaddingEnd(),
                mNavBarInset
        );
        return super.onApplyWindowInsets(insets);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // QSPanel will show as many rows as it can (up to TileLayout.MAX_ROWS) such that the
        // bottom and footer are inside the screen.
        MarginLayoutParams layoutParams = (MarginLayoutParams) mQSPanelContainer.getLayoutParams();

        int maxQs = getDisplayHeight() - layoutParams.topMargin - layoutParams.bottomMargin
        int availableHeight = View.MeasureSpec.getSize(heightMeasureSpec);
        int maxQs = availableHeight - layoutParams.topMargin - layoutParams.bottomMargin
                - getPaddingBottom();
        int padding = mPaddingLeft + mPaddingRight + layoutParams.leftMargin
                + layoutParams.rightMargin;
@@ -122,11 +109,11 @@ public class QSContainerImpl extends FrameLayout implements Dumpable {
                MeasureSpec.makeMeasureSpec(maxQs, MeasureSpec.AT_MOST));
        int width = mQSPanelContainer.getMeasuredWidth() + padding;
        super.onMeasure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(getDisplayHeight(), MeasureSpec.EXACTLY));
                MeasureSpec.makeMeasureSpec(availableHeight, MeasureSpec.EXACTLY));
        // QSCustomizer will always be the height of the screen, but do this after
        // other measuring to avoid changing the height of the QS.
        mQSCustomizer.measure(widthMeasureSpec,
                MeasureSpec.makeMeasureSpec(getDisplayHeight(), MeasureSpec.EXACTLY));
                MeasureSpec.makeMeasureSpec(availableHeight, MeasureSpec.EXACTLY));
    }

    @Override
+6 −6
Original line number Diff line number Diff line
@@ -46,8 +46,8 @@ import com.android.systemui.R;
import com.android.systemui.plugins.ActivityStarter;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.qs.DetailAdapter;
import com.android.systemui.plugins.qs.QSContainerController;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;

public class QSDetail extends LinearLayout {

@@ -86,7 +86,7 @@ public class QSDetail extends LinearLayout {
    private boolean mSwitchState;
    private QSFooter mFooter;

    private NotificationsQuickSettingsContainer mContainer;
    private QSContainerController mQsContainerController;

    public QSDetail(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
@@ -120,8 +120,8 @@ public class QSDetail extends LinearLayout {
        mClipper = new QSDetailClipper(this);
    }

    public void setContainer(NotificationsQuickSettingsContainer container) {
        mContainer = container;
    public void setContainerController(QSContainerController controller) {
        mQsContainerController = controller;
    }

    /** */
@@ -262,8 +262,8 @@ public class QSDetail extends LinearLayout {
        }
        sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED);
        animateDetailVisibleDiff(x, y, visibleDiff, listener);
        if (mContainer != null) {
            mContainer.setDetailShowing(showingDetail);
        if (mQsContainerController != null) {
            mQsContainerController.setDetailShowing(showingDetail);
        }
    }

+4 −6
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.media.MediaHost;
import com.android.systemui.plugins.FalsingManager;
import com.android.systemui.plugins.qs.QS;
import com.android.systemui.plugins.qs.QSContainerController;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.qs.customize.QSCustomizerController;
import com.android.systemui.qs.dagger.QSFragmentComponent;
@@ -50,7 +51,6 @@ import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.StatusBarState;
import com.android.systemui.statusbar.notification.stack.StackStateAnimator;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
import com.android.systemui.statusbar.phone.NotificationsQuickSettingsContainer;
import com.android.systemui.statusbar.policy.BrightnessMirrorController;
import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler;
import com.android.systemui.util.InjectionInflationController;
@@ -336,11 +336,9 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
    }

    @Override
    public void setContainer(ViewGroup container) {
        if (container instanceof NotificationsQuickSettingsContainer) {
            mQSCustomizerController.setContainer((NotificationsQuickSettingsContainer) container);
            mQSDetail.setContainer((NotificationsQuickSettingsContainer) container);
        }
    public void setContainerController(QSContainerController controller) {
        mQSCustomizerController.setContainerController(controller);
        mQSDetail.setContainerController(controller);
    }

    @Override
Loading