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

Commit c342d9b4 authored by Michał Brzeziński's avatar Michał Brzeziński Committed by Android (Google) Code Review
Browse files

Merge "Moving adjusting constraints to NotificationsQSContainerController" into tm-dev

parents 0fa33957 5ed6e969
Loading
Loading
Loading
Loading
+2 −56
Original line number 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.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.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.keyguard.KeyguardClockSwitch.LARGE;
@@ -1080,14 +1076,10 @@ public class NotificationPanelViewController extends PanelViewController {

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

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

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

        int notificationsBottomMargin = mResources.getDimensionPixelSize(
                R.dimen.notification_panel_margin_bottom);
        mSplitShadeStatusBarHeight = Utils.getSplitShadeStatusBarHeight(mView.getContext());
        int topMargin = mShouldUseSplitNotificationShade ? mSplitShadeStatusBarHeight :
                mResources.getDimensionPixelSize(R.dimen.notification_panel_margin_top);
        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);
        mNotificationsQSContainerController.updateMargins();
        mNotificationsQSContainerController.setSplitShadeEnabled(mShouldUseSplitNotificationShade);
        mNotificationsQSContainerController.updateResources();

        updateKeyguardStatusViewAlignment(/* animate= */false);

@@ -1150,15 +1105,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) {
        View view = mView.findViewById(viewId);
        if (view != null) {
+100 −21
Original line number Diff line number Diff line
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 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.flags.FeatureFlags
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.OverviewProxyListener
import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.util.Utils
import com.android.systemui.util.ViewController
import java.util.function.Consumer
import javax.inject.Inject
@@ -28,23 +38,20 @@ class NotificationsQSContainerController @Inject constructor(
                mView.invalidate()
            }
        }
    var splitShadeEnabled = false
        set(value) {
            if (field != value) {
                field = value
                // in case device configuration changed while showing QS details/customizer
                updateBottomSpacing()
            }
        }

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

    private var splitShadeStatusBarHeight = 0
    private var notificationsBottomMargin = 0
    private var scrimShadeBottomMargin = 0
    private var bottomStableInsets = 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 taskbarVisible = false
@@ -68,7 +75,6 @@ class NotificationsQSContainerController @Inject constructor(
    }

    public override fun onViewAttached() {
        updateMargins()
        updateResources()
        overviewProxyService.addCallback(taskbarVisibilityListener)
        mView.setInsetsChangedListener(windowInsetsListener)
@@ -83,7 +89,27 @@ class NotificationsQSContainerController @Inject constructor(
        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
        scrimShadeBottomMargin = resources.getDimensionPixelSize(
            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) {
        if (isQSCustomizerAnimating != animating) {
            isQSCustomizerAnimating = animating
@@ -178,4 +195,66 @@ class NotificationsQSContainerController @Inject constructor(
        }
        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 Diff line number Diff line
@@ -26,6 +26,7 @@ import android.view.WindowInsets;

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

import com.android.systemui.R;
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) {
        mInsetsChangedListener = onInsetsChangedListener;
    }
@@ -197,4 +194,7 @@ public class NotificationsQuickSettingsContainer extends ConstraintLayout
        }
    }

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

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

@@ -389,8 +387,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
        when(mView.findViewById(R.id.keyguard_status_view))
                .thenReturn(mock(KeyguardStatusView.class));
        mNotificationContainerParent = new NotificationsQuickSettingsContainer(getContext(), null);
        mNotificationContainerParent.addView(newViewWithId(R.id.qs_frame));
        mNotificationContainerParent.addView(newViewWithId(R.id.notification_stack_scroller));
        mNotificationContainerParent.addView(mKeyguardStatusView);
        mNotificationContainerParent.onFinishInflate();
        when(mView.findViewById(R.id.notification_container_parent))
@@ -678,31 +674,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
        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
    public void testKeyguardStatusViewInSplitShade_changesConstraintsDependingOnNotifications() {
        mStatusBarStateController.setState(KEYGUARD);
@@ -751,46 +722,6 @@ public class NotificationPanelViewControllerTest extends SysuiTestCase {
        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
    public void testCanCollapsePanelOnTouch_trueForKeyGuard() {
        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) {
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(mNotificationContainerParent);
+135 −37

File changed.

Preview size limit exceeded, changes collapsed.