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

Commit f9d5abc1 authored by Alex Florescu's avatar Alex Florescu
Browse files

Ensure ConstraintLayout children have ids

This will be needed to modify constraints at runtime.

Bug: 171917882
Test: atest SystemUITests:NotificationPanelViewTest
Change-Id: I5238d8f15930957fb807501538f6d942186bea9f
parent fc5e946c
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -19,4 +19,7 @@

    <!-- Max number of columns for quick controls area -->
    <integer name="controls_max_columns">2</integer>

    <!-- Whether to use the split 2-column notification shade -->
    <bool name="config_use_split_notification_shade">true</bool>
</resources>
+3 −0
Original line number Diff line number Diff line
@@ -566,4 +566,7 @@

    <!-- Whether wallet view is shown in landscape / seascape orientations -->
    <bool name="global_actions_show_landscape_wallet_view">false</bool>

    <!-- Whether to use the split 2-column notification shade -->
    <bool name="config_use_split_notification_shade">false</bool>
</resources>
+26 −1
Original line number Diff line number Diff line
@@ -95,6 +95,7 @@ import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
import com.android.systemui.qs.QSDetailDisplayer;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.GestureRecorder;
import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.KeyguardIndicationController;
@@ -292,6 +293,7 @@ public class NotificationPanelViewController extends PanelViewController {
    private final StatusBarKeyguardViewManager mStatusBarKeyguardViewManager;
    private final KeyguardStatusViewComponent.Factory mKeyguardStatusViewComponentFactory;
    private final QSDetailDisplayer mQSDetailDisplayer;
    private final FeatureFlags mFeatureFlags;
    private final ScrimController mScrimController;
    // Maximum # notifications to show on Keyguard; extras will be collapsed in an overflow card.
    // If there are exactly 1 + mMaxKeyguardNotifications, then still shows all notifications
@@ -554,7 +556,9 @@ public class NotificationPanelViewController extends PanelViewController {
            QSDetailDisplayer qsDetailDisplayer,
            ScrimController scrimController,
            MediaDataManager mediaDataManager,
            AmbientState ambientState) {
            AmbientState ambientState,
            FeatureFlags featureFlags
    ) {
        super(view, falsingManager, dozeLog, keyguardStateController,
                (SysuiStatusBarStateController) statusBarStateController, vibratorHelper,
                latencyTracker, flingAnimationUtilsBuilder.get(), statusBarTouchableRegionManager,
@@ -571,6 +575,7 @@ public class NotificationPanelViewController extends PanelViewController {
        mNotificationIconAreaController = notificationIconAreaController;
        mKeyguardStatusViewComponentFactory = keyguardStatusViewComponentFactory;
        mQSDetailDisplayer = qsDetailDisplayer;
        mFeatureFlags = featureFlags;
        mView.setWillNotDraw(!DEBUG);
        mLayoutInflater = layoutInflater;
        mFalsingManager = falsingManager;
@@ -768,6 +773,26 @@ public class NotificationPanelViewController extends PanelViewController {
            lp.width = panelWidth;
            mNotificationStackScrollLayoutController.setLayoutParams(lp);
        }

        if (shouldUseSplitNotificationShade()) {
            // In order to change the constraints at runtime, all children of the Constraint Layout
            // must have ids.
            ensureAllViewsHaveIds(mNotificationContainerParent);
        }
    }

    private boolean shouldUseSplitNotificationShade() {
        return mFeatureFlags.isTwoColumnNotificationShadeEnabled()
                && mResources.getBoolean(R.bool.config_use_split_notification_shade);
    }

    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 void reInflateViews() {
+35 −1
Original line number Diff line number Diff line
@@ -68,6 +68,7 @@ import com.android.systemui.media.MediaDataManager;
import com.android.systemui.media.MediaHierarchyManager;
import com.android.systemui.qs.QSDetailDisplayer;
import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.FeatureFlags;
import com.android.systemui.statusbar.KeyguardAffordanceView;
import com.android.systemui.statusbar.NotificationLockscreenUserManager;
import com.android.systemui.statusbar.NotificationShelfController;
@@ -204,6 +205,10 @@ public class NotificationPanelViewTest extends SysuiTestCase {
    @Mock
    private MediaDataManager mMediaDataManager;
    @Mock
    private FeatureFlags mFeatureFlags;
    @Mock
    private NotificationsQuickSettingsContainer mNotificationContainerParent;
    @Mock
    private AmbientState mAmbientState;
    private NotificationPanelViewController mNotificationPanelViewController;
    private View.AccessibilityDelegate mAccessibiltyDelegate;
@@ -219,6 +224,8 @@ public class NotificationPanelViewTest extends SysuiTestCase {
        when(mResources.getDisplayMetrics()).thenReturn(mDisplayMetrics);
        mDisplayMetrics.density = 100;
        when(mResources.getBoolean(R.bool.config_enableNotificationShadeDrag)).thenReturn(true);
        when(mResources.getDimensionPixelSize(R.dimen.qs_panel_width)).thenReturn(400);
        when(mResources.getDimensionPixelSize(R.dimen.notification_panel_width)).thenReturn(400);
        when(mView.getContext()).thenReturn(getContext());
        when(mView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar);
        when(mView.findViewById(R.id.keyguard_clock_container)).thenReturn(mKeyguardClockSwitch);
@@ -237,6 +244,8 @@ public class NotificationPanelViewTest extends SysuiTestCase {
        when(mView.findViewById(R.id.keyguard_status_view))
                .thenReturn(mock(KeyguardStatusView.class));
        when(mView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar);
        when(mView.findViewById(R.id.notification_container_parent))
                .thenReturn(mNotificationContainerParent);
        FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder(
                mDisplayMetrics);

@@ -264,6 +273,11 @@ public class NotificationPanelViewTest extends SysuiTestCase {
                .thenReturn(mKeyguardClockSwitchController);
        when(mKeyguardStatusViewComponent.getKeyguardStatusViewController())
                .thenReturn(mKeyguardStatusViewController);
        when(mQsFrame.getLayoutParams()).thenReturn(
                new ViewGroup.LayoutParams(600, 400));
        when(mNotificationStackScrollLayoutController.getLayoutParams()).thenReturn(
                new ViewGroup.LayoutParams(600, 400));

        mNotificationPanelViewController = new NotificationPanelViewController(mView,
                mResources,
                mLayoutInflater,
@@ -285,7 +299,8 @@ public class NotificationPanelViewTest extends SysuiTestCase {
                new QSDetailDisplayer(),
                mScrimController,
                mMediaDataManager,
                mAmbientState);
                mAmbientState,
                mFeatureFlags);
        mNotificationPanelViewController.initDependencies(
                mStatusBar,
                mNotificationShelfController);
@@ -400,6 +415,25 @@ public class NotificationPanelViewTest extends SysuiTestCase {
        verify(mStatusBarKeyguardViewManager).showBouncer(true);
    }

    @Test
    public void testAllChildrenOfNotificationContainer_haveIds() {
        when(mNotificationContainerParent.getChildCount()).thenReturn(2);
        when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(true);
        when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(true);

        View view1 = new View(mContext);
        view1.setId(1);
        when(mNotificationContainerParent.getChildAt(0)).thenReturn(view1);

        View view2 = mock(View.class);
        when(mNotificationContainerParent.getChildAt(1)).thenReturn(view2);

        mNotificationPanelViewController.updateResources();

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

    private void onTouchEvent(MotionEvent ev) {
        mTouchHandler.onTouch(mView, ev);
    }