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

Commit 5ed6e969 authored by Michal Brzezinski's avatar Michal Brzezinski
Browse files

Moving adjusting constraints to NotificationsQSContainerController

That obviously forced other changes as well like moving several tests from NotificationPanelViewControllerTest to NotificationQSContainerControllerTest.
The next nice improvement would be moving all constrains changes to NotificationsQSContainerController

Bug: 222482227
Test: just refactoring
Change-Id: I1d94fd06e79d01342979dfaf60db12e5529a9ade
parent cdb9f0c8
Loading
Loading
Loading
Loading
+2 −56
Original line number Original line Diff line number Diff line
@@ -18,13 +18,9 @@ package com.android.systemui.statusbar.phone;


import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.app.StatusBarManager.WINDOW_STATE_SHOWING;
import static android.view.View.GONE;
import static android.view.View.GONE;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;


import static androidx.constraintlayout.widget.ConstraintSet.BOTTOM;
import static androidx.constraintlayout.widget.ConstraintSet.END;
import static androidx.constraintlayout.widget.ConstraintSet.END;
import static androidx.constraintlayout.widget.ConstraintSet.PARENT_ID;
import static androidx.constraintlayout.widget.ConstraintSet.PARENT_ID;
import static androidx.constraintlayout.widget.ConstraintSet.START;
import static androidx.constraintlayout.widget.ConstraintSet.TOP;


import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE;
import static com.android.internal.jank.InteractionJankMonitor.CUJ_NOTIFICATION_SHADE_QS_EXPAND_COLLAPSE;
import static com.android.keyguard.KeyguardClockSwitch.LARGE;
import static com.android.keyguard.KeyguardClockSwitch.LARGE;
@@ -1070,14 +1066,10 @@ public class NotificationPanelViewController extends PanelViewController {


    public void updateResources() {
    public void updateResources() {
        mQuickQsOffsetHeight = SystemBarUtils.getQuickQsOffsetHeight(mView.getContext());
        mQuickQsOffsetHeight = SystemBarUtils.getQuickQsOffsetHeight(mView.getContext());
        mSplitShadeStatusBarHeight = Utils.getSplitShadeStatusBarHeight(mView.getContext());
        mSplitShadeNotificationsScrimMarginBottom =
        mSplitShadeNotificationsScrimMarginBottom =
                mResources.getDimensionPixelSize(
                mResources.getDimensionPixelSize(
                        R.dimen.split_shade_notifications_scrim_margin_bottom);
                        R.dimen.split_shade_notifications_scrim_margin_bottom);


        int panelMarginHorizontal = mResources.getDimensionPixelSize(
                R.dimen.notification_panel_margin_horizontal);

        final boolean newShouldUseSplitNotificationShade =
        final boolean newShouldUseSplitNotificationShade =
                Utils.shouldUseSplitNotificationShade(mResources);
                Utils.shouldUseSplitNotificationShade(mResources);
        final boolean splitNotificationShadeChanged =
        final boolean splitNotificationShadeChanged =
@@ -1087,49 +1079,12 @@ public class NotificationPanelViewController extends PanelViewController {
        if (mQs != null) {
        if (mQs != null) {
            mQs.setInSplitShade(mShouldUseSplitNotificationShade);
            mQs.setInSplitShade(mShouldUseSplitNotificationShade);
        }
        }

        mSplitShadeStatusBarHeight = Utils.getSplitShadeStatusBarHeight(mView.getContext());
        int notificationsBottomMargin = mResources.getDimensionPixelSize(
                R.dimen.notification_panel_margin_bottom);
        int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight :
        int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight :
                mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top);
                mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top);
        mSplitShadeHeaderController.setSplitShadeMode(mShouldUseSplitNotificationShade);
        mSplitShadeHeaderController.setSplitShadeMode(mShouldUseSplitNotificationShade);

        // To change the constraints at runtime, all children of the ConstraintLayout must have ids
        ensureAllViewsHaveIds(mNotificationContainerParent);
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(mNotificationContainerParent);
        int statusViewMarginHorizontal = mResources.getDimensionPixelSize(
                R.dimen.status_view_margin_horizontal);
        constraintSet.setMargin(R.id.keyguard_status_view, START, statusViewMarginHorizontal);
        constraintSet.setMargin(R.id.keyguard_status_view, END, statusViewMarginHorizontal);
        if (mShouldUseSplitNotificationShade) {
            // width = 0 to take up all available space within constraints
            constraintSet.connect(R.id.qs_frame, END, R.id.qs_edge_guideline, END);
            constraintSet.connect(
                    R.id.notification_stack_scroller, START,
                    R.id.qs_edge_guideline, START);
            constraintSet.constrainHeight(R.id.split_shade_status_bar, mSplitShadeStatusBarHeight);
        } else {
            constraintSet.connect(R.id.qs_frame, END, PARENT_ID, END);
            constraintSet.connect(R.id.notification_stack_scroller, START, PARENT_ID, START);
            if (mUseCombinedQSHeaders) {
                constraintSet.constrainHeight(R.id.split_shade_status_bar, WRAP_CONTENT);
            }
        }
        constraintSet.setMargin(R.id.notification_stack_scroller, START,
                mShouldUseSplitNotificationShade ? 0 : panelMarginHorizontal);
        constraintSet.setMargin(R.id.notification_stack_scroller, END, panelMarginHorizontal);
        constraintSet.setMargin(R.id.notification_stack_scroller, TOP, topMargin);
        constraintSet.setMargin(R.id.notification_stack_scroller, BOTTOM,
                notificationsBottomMargin);
        constraintSet.setMargin(R.id.qs_frame, START, panelMarginHorizontal);
        constraintSet.setMargin(R.id.qs_frame, END,
                mShouldUseSplitNotificationShade ? 0 : panelMarginHorizontal);
        constraintSet.setMargin(R.id.qs_frame, TOP, topMargin);
        constraintSet.applyTo(mNotificationContainerParent);
        mAmbientState.setStackTopMargin(topMargin);
        mAmbientState.setStackTopMargin(topMargin);
        mNotificationsQSContainerController.updateMargins();
        mNotificationsQSContainerController.updateResources();
        mNotificationsQSContainerController.setSplitShadeEnabled(mShouldUseSplitNotificationShade);


        updateKeyguardStatusViewAlignment(/* animate= */false);
        updateKeyguardStatusViewAlignment(/* animate= */false);


@@ -1140,15 +1095,6 @@ public class NotificationPanelViewController extends PanelViewController {
        }
        }
    }
    }


    private static void ensureAllViewsHaveIds(ViewGroup parentView) {
        for (int i = 0; i < parentView.getChildCount(); i++) {
            View childView = parentView.getChildAt(i);
            if (childView.getId() == View.NO_ID) {
                childView.setId(View.generateViewId());
            }
        }
    }

    private View reInflateStub(int viewId, int stubId, int layoutId, boolean enabled) {
    private View reInflateStub(int viewId, int stubId, int layoutId, boolean enabled) {
        View view = mView.findViewById(viewId);
        View view = mView.findViewById(viewId);
        if (view != null) {
        if (view != null) {
+100 −21
Original line number Original line Diff line number Diff line
package com.android.systemui.statusbar.phone
package com.android.systemui.statusbar.phone


import android.view.View
import android.view.ViewGroup
import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.view.WindowInsets
import android.view.WindowInsets
import androidx.constraintlayout.widget.ConstraintSet
import androidx.constraintlayout.widget.ConstraintSet.BOTTOM
import androidx.constraintlayout.widget.ConstraintSet.END
import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID
import androidx.constraintlayout.widget.ConstraintSet.START
import androidx.constraintlayout.widget.ConstraintSet.TOP
import com.android.systemui.R
import com.android.systemui.R
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags
import com.android.systemui.flags.Flags
@@ -10,6 +19,7 @@ import com.android.systemui.plugins.qs.QSContainerController
import com.android.systemui.recents.OverviewProxyService
import com.android.systemui.recents.OverviewProxyService
import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener
import com.android.systemui.recents.OverviewProxyService.OverviewProxyListener
import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.util.Utils
import com.android.systemui.util.ViewController
import com.android.systemui.util.ViewController
import java.util.function.Consumer
import java.util.function.Consumer
import javax.inject.Inject
import javax.inject.Inject
@@ -28,23 +38,20 @@ class NotificationsQSContainerController @Inject constructor(
                mView.invalidate()
                mView.invalidate()
            }
            }
        }
        }
    var splitShadeEnabled = false
    private var splitShadeEnabled = false
        set(value) {
            if (field != value) {
                field = value
                // in case device configuration changed while showing QS details/customizer
                updateBottomSpacing()
            }
        }

    private var isQSDetailShowing = false
    private var isQSDetailShowing = false
    private var isQSCustomizing = false
    private var isQSCustomizing = false
    private var isQSCustomizerAnimating = false
    private var isQSCustomizerAnimating = false


    private var splitShadeStatusBarHeight = 0
    private var notificationsBottomMargin = 0
    private var notificationsBottomMargin = 0
    private var scrimShadeBottomMargin = 0
    private var scrimShadeBottomMargin = 0
    private var bottomStableInsets = 0
    private var bottomStableInsets = 0
    private var bottomCutoutInsets = 0
    private var bottomCutoutInsets = 0
    private var panelMarginHorizontal = 0
    private var topMargin = 0

    private val useCombinedQSHeaders = featureFlags.isEnabled(Flags.COMBINED_QS_HEADERS)


    private var isGestureNavigation = true
    private var isGestureNavigation = true
    private var taskbarVisible = false
    private var taskbarVisible = false
@@ -68,7 +75,6 @@ class NotificationsQSContainerController @Inject constructor(
    }
    }


    public override fun onViewAttached() {
    public override fun onViewAttached() {
        updateMargins()
        updateResources()
        updateResources()
        overviewProxyService.addCallback(taskbarVisibilityListener)
        overviewProxyService.addCallback(taskbarVisibilityListener)
        mView.setInsetsChangedListener(windowInsetsListener)
        mView.setInsetsChangedListener(windowInsetsListener)
@@ -83,7 +89,27 @@ class NotificationsQSContainerController @Inject constructor(
        mView.setConfigurationChangedListener(null)
        mView.setConfigurationChangedListener(null)
    }
    }


    private fun updateResources() {
    fun updateResources() {
        val newSplitShadeEnabled = Utils.shouldUseSplitNotificationShade(resources)
        val splitShadeEnabledChanged = newSplitShadeEnabled != splitShadeEnabled
        splitShadeEnabled = newSplitShadeEnabled
        notificationsBottomMargin = resources.getDimensionPixelSize(
                R.dimen.notification_panel_margin_bottom)
        splitShadeStatusBarHeight = Utils.getSplitShadeStatusBarHeight(context)
        panelMarginHorizontal = resources.getDimensionPixelSize(
                R.dimen.notification_panel_margin_horizontal)
        topMargin = if (splitShadeEnabled) {
            splitShadeStatusBarHeight
        } else {
            resources.getDimensionPixelSize(R.dimen.notification_panel_margin_top)
        }
        updateConstraints()
        if (splitShadeEnabledChanged) {
            // Let's do it at the end when all margins/paddings were already applied.
            // We need to updateBottomSpacing() in case device configuration changed while showing
            // QS details/customizer
            updateBottomSpacing()
        }
        val previousScrimShadeBottomMargin = scrimShadeBottomMargin
        val previousScrimShadeBottomMargin = scrimShadeBottomMargin
        scrimShadeBottomMargin = resources.getDimensionPixelSize(
        scrimShadeBottomMargin = resources.getDimensionPixelSize(
            R.dimen.split_shade_notifications_scrim_margin_bottom
            R.dimen.split_shade_notifications_scrim_margin_bottom
@@ -94,15 +120,6 @@ class NotificationsQSContainerController @Inject constructor(
        }
        }
    }
    }


    /**
     * Update the notification bottom margin.
     *
     * Will not call updateBottomSpacing
     */
    fun updateMargins() {
        notificationsBottomMargin = mView.defaultNotificationsMarginBottom
    }

    override fun setCustomizerAnimating(animating: Boolean) {
    override fun setCustomizerAnimating(animating: Boolean) {
        if (isQSCustomizerAnimating != animating) {
        if (isQSCustomizerAnimating != animating) {
            isQSCustomizerAnimating = animating
            isQSCustomizerAnimating = animating
@@ -178,4 +195,66 @@ class NotificationsQSContainerController @Inject constructor(
        }
        }
        return containerPadding to stackScrollMargin
        return containerPadding to stackScrollMargin
    }
    }

    fun updateConstraints() {
        // To change the constraints at runtime, all children of the ConstraintLayout must have ids
        ensureAllViewsHaveIds(mView)
        val constraintSet = ConstraintSet()
        constraintSet.clone(mView)
        setKeyguardStatusViewConstraints(constraintSet)
        setQsConstraints(constraintSet)
        setNotificationsConstraints(constraintSet)
        setSplitShadeStatusBarConstraints(constraintSet)
        mView.applyConstraints(constraintSet)
    }

    private fun setSplitShadeStatusBarConstraints(constraintSet: ConstraintSet) {
        if (splitShadeEnabled) {
            constraintSet.constrainHeight(R.id.split_shade_status_bar, splitShadeStatusBarHeight)
        } else {
            if (useCombinedQSHeaders) {
                constraintSet.constrainHeight(R.id.split_shade_status_bar, WRAP_CONTENT)
            }
        }
    }

    private fun setNotificationsConstraints(constraintSet: ConstraintSet) {
        val startConstraintId = if (splitShadeEnabled) R.id.qs_edge_guideline else PARENT_ID
        constraintSet.apply {
            connect(R.id.notification_stack_scroller, START, startConstraintId, START)
            setMargin(R.id.notification_stack_scroller, START,
                    if (splitShadeEnabled) 0 else panelMarginHorizontal)
            setMargin(R.id.notification_stack_scroller, END, panelMarginHorizontal)
            setMargin(R.id.notification_stack_scroller, TOP, topMargin)
            setMargin(R.id.notification_stack_scroller, BOTTOM, notificationsBottomMargin)
        }
    }

    private fun setQsConstraints(constraintSet: ConstraintSet) {
        val endConstraintId = if (splitShadeEnabled) R.id.qs_edge_guideline else PARENT_ID
        constraintSet.apply {
            connect(R.id.qs_frame, END, endConstraintId, END)
            setMargin(R.id.qs_frame, START, panelMarginHorizontal)
            setMargin(R.id.qs_frame, END, if (splitShadeEnabled) 0 else panelMarginHorizontal)
            setMargin(R.id.qs_frame, TOP, topMargin)
        }
    }

    private fun setKeyguardStatusViewConstraints(constraintSet: ConstraintSet) {
        val statusViewMarginHorizontal = resources.getDimensionPixelSize(
                R.dimen.status_view_margin_horizontal)
        constraintSet.apply {
            setMargin(R.id.keyguard_status_view, START, statusViewMarginHorizontal)
            setMargin(R.id.keyguard_status_view, END, statusViewMarginHorizontal)
        }
    }

    private fun ensureAllViewsHaveIds(parentView: ViewGroup) {
        for (i in 0 until parentView.childCount) {
            val childView = parentView.getChildAt(i)
            if (childView.id == View.NO_ID) {
                childView.id = View.generateViewId()
            }
        }
    }
}
}
+4 −4
Original line number Original line Diff line number Diff line
@@ -26,6 +26,7 @@ import android.view.WindowInsets;


import androidx.annotation.Nullable;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;


import com.android.systemui.R;
import com.android.systemui.R;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentHostManager;
@@ -123,10 +124,6 @@ public class NotificationsQuickSettingsContainer extends ConstraintLayout
        }
        }
    }
    }


    public int getDefaultNotificationsMarginBottom() {
        return ((LayoutParams) mStackScroller.getLayoutParams()).bottomMargin;
    }

    public void setInsetsChangedListener(Consumer<WindowInsets> onInsetsChangedListener) {
    public void setInsetsChangedListener(Consumer<WindowInsets> onInsetsChangedListener) {
        mInsetsChangedListener = onInsetsChangedListener;
        mInsetsChangedListener = onInsetsChangedListener;
    }
    }
@@ -197,4 +194,7 @@ public class NotificationsQuickSettingsContainer extends ConstraintLayout
        }
        }
    }
    }


    public void applyConstraints(ConstraintSet constraintSet) {
        constraintSet.applyTo(this);
    }
}
}
+0 −80
Original line number Original line Diff line number Diff line
@@ -56,13 +56,11 @@ import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewPropertyAnimator;
import android.view.ViewPropertyAnimator;
import android.view.ViewStub;
import android.view.ViewStub;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.view.accessibility.AccessibilityNodeInfo;


import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


@@ -389,8 +387,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
        when(mView.findViewById(R.id.keyguard_status_view))
        when(mView.findViewById(R.id.keyguard_status_view))
                .thenReturn(mock(KeyguardStatusView.class));
                .thenReturn(mock(KeyguardStatusView.class));
        mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null);
        mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null);
        mNotificationContainerParent.addView(newViewWithId(R.id.qs_frame));
        mNotificationContainerParent.addView(newViewWithId(R.id.notification_stack_scroller));
        mNotificationContainerParent.addView(mKeyguardStatusView);
        mNotificationContainerParent.addView(mKeyguardStatusView);
        mNotificationContainerParent.onFinishInflate();
        mNotificationContainerParent.onFinishInflate();
        when(mView.findViewById(R.id.notification_container_parent))
        when(mView.findViewById(R.id.notification_container_parent))
@@ -678,31 +674,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
        verify(mStatusBarKeyguardViewManager).showBouncer(true);
        verify(mStatusBarKeyguardViewManager).showBouncer(true);
    }
    }


    @Test
    public void testAllChildrenOfNotificationContainer_haveIds() {
        enableSplitShade(/* enabled= */ true);
        mNotificationContainerParent.removeAllViews();
        mNotificationContainerParent.addView(newViewWithId(1));
        mNotificationContainerParent.addView(newViewWithId(View.NO_ID));

        mNotificationPanelViewController.updateResources();

        assertThat(mNotificationContainerParent.getChildAt(0).getId()).isEqualTo(1);
        assertThat(mNotificationContainerParent.getChildAt(1).getId()).isNotEqualTo(View.NO_ID);
    }

    @Test
    public void testSinglePaneShadeLayout_isAlignedToParent() {
        enableSplitShade(/* enabled= */ false);

        mNotificationPanelViewController.updateResources();

        assertThat(getConstraintSetLayout(R.id.qs_frame).endToEnd)
                .isEqualTo(ConstraintSet.PARENT_ID);
        assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).startToStart)
                .isEqualTo(ConstraintSet.PARENT_ID);
    }

    @Test
    @Test
    public void testKeyguardStatusViewInSplitShade_changesConstraintsDependingOnNotifications() {
    public void testKeyguardStatusViewInSplitShade_changesConstraintsDependingOnNotifications() {
        mStatusBarStateController.setState(KEYGUARD);
        mStatusBarStateController.setState(KEYGUARD);
@@ -751,46 +722,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
        verify(mUserSwitcherStubView).inflate();
        verify(mUserSwitcherStubView).inflate();
    }
    }


    @Test
    public void testSplitShadeLayout_isAlignedToGuideline() {
        enableSplitShade(/* enabled= */ true);

        mNotificationPanelViewController.updateResources();

        assertThat(getConstraintSetLayout(R.id.qs_frame).endToEnd)
                .isEqualTo(R.id.qs_edge_guideline);
        assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).startToStart)
                .isEqualTo(R.id.qs_edge_guideline);
    }

    @Test
    public void testSplitShadeLayout_childrenHaveInsideMarginsOfZero() {
        enableSplitShade(/* enabled= */ true);

        mNotificationPanelViewController.updateResources();

        assertThat(getConstraintSetLayout(R.id.qs_frame).startMargin).isEqualTo(10);
        assertThat(getConstraintSetLayout(R.id.qs_frame).endMargin).isEqualTo(0);
        assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).startMargin)
                .isEqualTo(0);
        assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).endMargin)
                .isEqualTo(10);
    }

    @Test
    public void testSinglePaneLayout_childrenHaveEqualMargins() {
        enableSplitShade(/* enabled= */ false);

        mNotificationPanelViewController.updateResources();

        assertThat(getConstraintSetLayout(R.id.qs_frame).startMargin).isEqualTo(10);
        assertThat(getConstraintSetLayout(R.id.qs_frame).endMargin).isEqualTo(10);
        assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).startMargin)
                .isEqualTo(10);
        assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).endMargin)
                .isEqualTo(10);
    }

    @Test
    @Test
    public void testCanCollapsePanelOnTouch_trueForKeyGuard() {
    public void testCanCollapsePanelOnTouch_trueForKeyGuard() {
        mStatusBarStateController.setState(KEYGUARD);
        mStatusBarStateController.setState(KEYGUARD);
@@ -1016,17 +947,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
        }
        }
    }
    }



    private View newViewWithId(int id) {
        View view = new View(mContext);
        view.setId(id);
        ConstraintLayout.LayoutParams layoutParams = new ConstraintLayout.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        // required as cloning ConstraintSet fails if view doesn't have layout params
        view.setLayoutParams(layoutParams);
        return view;
    }

    private ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) {
    private ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) {
        ConstraintSet constraintSet = new ConstraintSet();
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(mNotificationContainerParent);
        constraintSet.clone(mNotificationContainerParent);
+135 −37

File changed.

Preview size limit exceeded, changes collapsed.