Merge "Ensure ConstraintLayout children have ids" into sc-dev

This commit is contained in:
Alex Florescu
2021-02-05 08:35:59 +00:00
committed by Android (Google) Code Review
4 changed files with 67 additions and 2 deletions

View File

@@ -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>

View File

@@ -565,4 +565,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>

View File

@@ -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() {

View File

@@ -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);
}