Merge "Making notifications wider in split shade mode" into sc-dev am: e4b11be6c8
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13601945 MUST ONLY BE SUBMITTED BY AUTOMERGER Change-Id: I44dc3671cc6572292579bd0a248f4c381e628158
This commit is contained in:
@@ -73,7 +73,7 @@
|
|||||||
android:id="@+id/qs_edge_guideline"
|
android:id="@+id/qs_edge_guideline"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
systemui:layout_constraintGuide_percent="0.5"
|
systemui:layout_constraintGuide_percent="0.4"
|
||||||
android:orientation="vertical"/>
|
android:orientation="vertical"/>
|
||||||
|
|
||||||
<com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
|
<com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayout
|
||||||
|
|||||||
@@ -868,25 +868,16 @@ public class NotificationPanelViewController extends PanelViewController {
|
|||||||
|
|
||||||
public void updateResources() {
|
public void updateResources() {
|
||||||
int qsWidth = mResources.getDimensionPixelSize(R.dimen.qs_panel_width);
|
int qsWidth = mResources.getDimensionPixelSize(R.dimen.qs_panel_width);
|
||||||
ViewGroup.LayoutParams lp = mQsFrame.getLayoutParams();
|
|
||||||
if (lp.width != qsWidth) {
|
|
||||||
lp.width = qsWidth;
|
|
||||||
mQsFrame.setLayoutParams(lp);
|
|
||||||
}
|
|
||||||
|
|
||||||
int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
|
int panelWidth = mResources.getDimensionPixelSize(R.dimen.notification_panel_width);
|
||||||
lp = mNotificationStackScrollLayoutController.getLayoutParams();
|
|
||||||
if (lp.width != panelWidth) {
|
|
||||||
lp.width = panelWidth;
|
|
||||||
mNotificationStackScrollLayoutController.setLayoutParams(lp);
|
|
||||||
}
|
|
||||||
|
|
||||||
// In order to change the constraints at runtime, all children of the Constraint Layout
|
// To change the constraints at runtime, all children of the ConstraintLayout must have ids
|
||||||
// must have ids.
|
|
||||||
ensureAllViewsHaveIds(mNotificationContainerParent);
|
ensureAllViewsHaveIds(mNotificationContainerParent);
|
||||||
ConstraintSet constraintSet = new ConstraintSet();
|
ConstraintSet constraintSet = new ConstraintSet();
|
||||||
constraintSet.clone(mNotificationContainerParent);
|
constraintSet.clone(mNotificationContainerParent);
|
||||||
if (Utils.shouldUseSplitNotificationShade(mFeatureFlags, mResources)) {
|
if (Utils.shouldUseSplitNotificationShade(mFeatureFlags, mResources)) {
|
||||||
|
// width = 0 to take up all available space within constraints
|
||||||
|
qsWidth = 0;
|
||||||
|
panelWidth = 0;
|
||||||
constraintSet.connect(R.id.qs_frame, END, R.id.qs_edge_guideline, END);
|
constraintSet.connect(R.id.qs_frame, END, R.id.qs_edge_guideline, END);
|
||||||
constraintSet.connect(
|
constraintSet.connect(
|
||||||
R.id.notification_stack_scroller, START,
|
R.id.notification_stack_scroller, START,
|
||||||
@@ -895,6 +886,8 @@ public class NotificationPanelViewController extends PanelViewController {
|
|||||||
constraintSet.connect(R.id.qs_frame, END, PARENT_ID, END);
|
constraintSet.connect(R.id.qs_frame, END, PARENT_ID, END);
|
||||||
constraintSet.connect(R.id.notification_stack_scroller, START, PARENT_ID, START);
|
constraintSet.connect(R.id.notification_stack_scroller, START, PARENT_ID, START);
|
||||||
}
|
}
|
||||||
|
constraintSet.getConstraint(R.id.notification_stack_scroller).layout.mWidth = panelWidth;
|
||||||
|
constraintSet.getConstraint(R.id.qs_frame).layout.mWidth = qsWidth;
|
||||||
constraintSet.applyTo(mNotificationContainerParent);
|
constraintSet.applyTo(mNotificationContainerParent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -18,14 +18,12 @@ package com.android.systemui.statusbar.phone;
|
|||||||
|
|
||||||
import android.app.Fragment;
|
import android.app.Fragment;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Configuration;
|
|
||||||
import android.graphics.Canvas;
|
import android.graphics.Canvas;
|
||||||
import android.util.AttributeSet;
|
import android.util.AttributeSet;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowInsets;
|
import android.view.WindowInsets;
|
||||||
import android.widget.FrameLayout;
|
import android.widget.FrameLayout;
|
||||||
|
|
||||||
import androidx.annotation.DimenRes;
|
|
||||||
import androidx.constraintlayout.widget.ConstraintLayout;
|
import androidx.constraintlayout.widget.ConstraintLayout;
|
||||||
|
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
@@ -82,22 +80,6 @@ public class NotificationsQuickSettingsContainer extends ConstraintLayout
|
|||||||
FragmentHostManager.get(this).removeTagListener(QS.TAG, this);
|
FragmentHostManager.get(this).removeTagListener(QS.TAG, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void onConfigurationChanged(Configuration newConfig) {
|
|
||||||
super.onConfigurationChanged(newConfig);
|
|
||||||
reloadWidth(mQsFrame, R.dimen.qs_panel_width);
|
|
||||||
reloadWidth(mStackScroller, R.dimen.notification_panel_width);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads the given width resource and sets it on the given View.
|
|
||||||
*/
|
|
||||||
private void reloadWidth(View view, @DimenRes int width) {
|
|
||||||
LayoutParams params = (LayoutParams) view.getLayoutParams();
|
|
||||||
params.width = getResources().getDimensionPixelSize(width);
|
|
||||||
view.setLayoutParams(params);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
|
public WindowInsets onApplyWindowInsets(WindowInsets insets) {
|
||||||
mBottomPadding = insets.getStableInsetBottom();
|
mBottomPadding = insets.getStableInsetBottom();
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import static org.mockito.Mockito.spy;
|
|||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import android.annotation.IdRes;
|
||||||
import android.app.ActivityManager;
|
import android.app.ActivityManager;
|
||||||
import android.app.StatusBarManager;
|
import android.app.StatusBarManager;
|
||||||
import android.content.res.Configuration;
|
import android.content.res.Configuration;
|
||||||
@@ -269,8 +270,9 @@ public class NotificationPanelViewTest extends SysuiTestCase {
|
|||||||
when(mView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame);
|
when(mView.findViewById(R.id.qs_frame)).thenReturn(mQsFrame);
|
||||||
when(mView.findViewById(R.id.keyguard_status_view))
|
when(mView.findViewById(R.id.keyguard_status_view))
|
||||||
.thenReturn(mock(KeyguardStatusView.class));
|
.thenReturn(mock(KeyguardStatusView.class));
|
||||||
when(mView.findViewById(R.id.keyguard_header)).thenReturn(mKeyguardStatusBar);
|
|
||||||
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));
|
||||||
when(mView.findViewById(R.id.notification_container_parent))
|
when(mView.findViewById(R.id.notification_container_parent))
|
||||||
.thenReturn(mNotificationContainerParent);
|
.thenReturn(mNotificationContainerParent);
|
||||||
FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder(
|
FlingAnimationUtils.Builder flingAnimationUtilsBuilder = new FlingAnimationUtils.Builder(
|
||||||
@@ -300,10 +302,6 @@ public class NotificationPanelViewTest extends SysuiTestCase {
|
|||||||
.thenReturn(mKeyguardClockSwitchController);
|
.thenReturn(mKeyguardClockSwitchController);
|
||||||
when(mKeyguardStatusViewComponent.getKeyguardStatusViewController())
|
when(mKeyguardStatusViewComponent.getKeyguardStatusViewController())
|
||||||
.thenReturn(mKeyguardStatusViewController);
|
.thenReturn(mKeyguardStatusViewController);
|
||||||
when(mQsFrame.getLayoutParams()).thenReturn(
|
|
||||||
new ViewGroup.LayoutParams(600, 400));
|
|
||||||
when(mNotificationStackScrollLayoutController.getLayoutParams()).thenReturn(
|
|
||||||
new ViewGroup.LayoutParams(600, 400));
|
|
||||||
|
|
||||||
mNotificationPanelViewController = new NotificationPanelViewController(mView,
|
mNotificationPanelViewController = new NotificationPanelViewController(mView,
|
||||||
mResources,
|
mResources,
|
||||||
@@ -451,7 +449,8 @@ public class NotificationPanelViewTest extends SysuiTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testAllChildrenOfNotificationContainer_haveIds() {
|
public void testAllChildrenOfNotificationContainer_haveIds() {
|
||||||
enableDualPaneShade();
|
enableSplitShade();
|
||||||
|
mNotificationContainerParent.removeAllViews();
|
||||||
mNotificationContainerParent.addView(newViewWithId(1));
|
mNotificationContainerParent.addView(newViewWithId(1));
|
||||||
mNotificationContainerParent.addView(newViewWithId(View.NO_ID));
|
mNotificationContainerParent.addView(newViewWithId(View.NO_ID));
|
||||||
|
|
||||||
@@ -464,35 +463,59 @@ public class NotificationPanelViewTest extends SysuiTestCase {
|
|||||||
@Test
|
@Test
|
||||||
public void testSinglePaneShadeLayout_isAlignedToParent() {
|
public void testSinglePaneShadeLayout_isAlignedToParent() {
|
||||||
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(false);
|
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(false);
|
||||||
mNotificationContainerParent.addView(newViewWithId(R.id.qs_frame));
|
|
||||||
mNotificationContainerParent.addView(newViewWithId(R.id.notification_stack_scroller));
|
|
||||||
|
|
||||||
mNotificationPanelViewController.updateResources();
|
mNotificationPanelViewController.updateResources();
|
||||||
|
|
||||||
ConstraintSet constraintSet = new ConstraintSet();
|
assertThat(getConstraintSetLayout(R.id.qs_frame).endToEnd)
|
||||||
constraintSet.clone(mNotificationContainerParent);
|
.isEqualTo(ConstraintSet.PARENT_ID);
|
||||||
ConstraintSet.Layout qsFrameLayout = constraintSet.getConstraint(R.id.qs_frame).layout;
|
assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).startToStart)
|
||||||
ConstraintSet.Layout stackScrollerLayout = constraintSet.getConstraint(
|
.isEqualTo(ConstraintSet.PARENT_ID);
|
||||||
R.id.notification_stack_scroller).layout;
|
|
||||||
assertThat(qsFrameLayout.endToEnd).isEqualTo(ConstraintSet.PARENT_ID);
|
|
||||||
assertThat(stackScrollerLayout.startToStart).isEqualTo(ConstraintSet.PARENT_ID);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSplitShadeLayout_isAlignedToGuideline() {
|
public void testSplitShadeLayout_isAlignedToGuideline() {
|
||||||
enableDualPaneShade();
|
enableSplitShade();
|
||||||
mNotificationContainerParent.addView(newViewWithId(R.id.qs_frame));
|
|
||||||
mNotificationContainerParent.addView(newViewWithId(R.id.notification_stack_scroller));
|
|
||||||
|
|
||||||
mNotificationPanelViewController.updateResources();
|
mNotificationPanelViewController.updateResources();
|
||||||
|
|
||||||
ConstraintSet constraintSet = new ConstraintSet();
|
assertThat(getConstraintSetLayout(R.id.qs_frame).endToEnd)
|
||||||
constraintSet.clone(mNotificationContainerParent);
|
.isEqualTo(R.id.qs_edge_guideline);
|
||||||
ConstraintSet.Layout qsFrameLayout = constraintSet.getConstraint(R.id.qs_frame).layout;
|
assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).startToStart)
|
||||||
ConstraintSet.Layout stackScrollerLayout = constraintSet.getConstraint(
|
.isEqualTo(R.id.qs_edge_guideline);
|
||||||
R.id.notification_stack_scroller).layout;
|
}
|
||||||
assertThat(qsFrameLayout.endToEnd).isEqualTo(R.id.qs_edge_guideline);
|
|
||||||
assertThat(stackScrollerLayout.startToStart).isEqualTo(R.id.qs_edge_guideline);
|
@Test
|
||||||
|
public void testSinglePaneShadeLayout_childrenHaveConstantWidth() {
|
||||||
|
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(false);
|
||||||
|
|
||||||
|
mNotificationPanelViewController.updateResources();
|
||||||
|
|
||||||
|
assertThat(getConstraintSetLayout(R.id.qs_frame).mWidth)
|
||||||
|
.isEqualTo(mResources.getDimensionPixelSize(R.dimen.qs_panel_width));
|
||||||
|
assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).mWidth)
|
||||||
|
.isEqualTo(mResources.getDimensionPixelSize(R.dimen.notification_panel_width));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSplitShadeLayout_childrenHaveZeroWidth() {
|
||||||
|
enableSplitShade();
|
||||||
|
|
||||||
|
mNotificationPanelViewController.updateResources();
|
||||||
|
|
||||||
|
assertThat(getConstraintSetLayout(R.id.qs_frame).mWidth).isEqualTo(0);
|
||||||
|
assertThat(getConstraintSetLayout(R.id.notification_stack_scroller).mWidth).isEqualTo(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testOnDragDownEvent_horizontalTranslationIsZeroForSplitShade() {
|
||||||
|
when(mNotificationStackScrollLayoutController.getWidth()).thenReturn(350f);
|
||||||
|
when(mView.getWidth()).thenReturn(800);
|
||||||
|
enableSplitShade();
|
||||||
|
|
||||||
|
onTouchEvent(MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN,
|
||||||
|
200f /* x position */, 0f, 0));
|
||||||
|
|
||||||
|
verify(mQsFrame).setTranslationX(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -538,19 +561,13 @@ public class NotificationPanelViewTest extends SysuiTestCase {
|
|||||||
return view;
|
return view;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
private ConstraintSet.Layout getConstraintSetLayout(@IdRes int id) {
|
||||||
public void testOnDragDownEvent_horizontalTranslationIsZeroForDualPaneShade() {
|
ConstraintSet constraintSet = new ConstraintSet();
|
||||||
when(mNotificationStackScrollLayoutController.getWidth()).thenReturn(350f);
|
constraintSet.clone(mNotificationContainerParent);
|
||||||
when(mView.getWidth()).thenReturn(800);
|
return constraintSet.getConstraint(id).layout;
|
||||||
enableDualPaneShade();
|
|
||||||
|
|
||||||
onTouchEvent(MotionEvent.obtain(0L, 0L, MotionEvent.ACTION_DOWN,
|
|
||||||
200f /* x position */, 0f, 0));
|
|
||||||
|
|
||||||
verify(mQsFrame).setTranslationX(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enableDualPaneShade() {
|
private void enableSplitShade() {
|
||||||
when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(true);
|
when(mResources.getBoolean(R.bool.config_use_split_notification_shade)).thenReturn(true);
|
||||||
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(true);
|
when(mFeatureFlags.isTwoColumnNotificationShadeEnabled()).thenReturn(true);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user