diff --git a/packages/SystemUI/res/layout/dream_overlay_container.xml b/packages/SystemUI/res/layout/dream_overlay_container.xml index ae0a9374fd2c4..19fb874ea2bee 100644 --- a/packages/SystemUI/res/layout/dream_overlay_container.xml +++ b/packages/SystemUI/res/layout/dream_overlay_container.xml @@ -25,10 +25,6 @@ android:id="@+id/dream_overlay_content" android:layout_width="match_parent" android:layout_height="0dp" - android:paddingTop="@dimen/dream_overlay_container_padding_top" - android:paddingEnd="@dimen/dream_overlay_container_padding_end" - android:paddingBottom="@dimen/dream_overlay_container_padding_bottom" - android:paddingStart="@dimen/dream_overlay_container_padding_start" android:clipToPadding="false" android:clipChildren="false" app:layout_constraintTop_toBottomOf="@id/dream_overlay_status_bar" diff --git a/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java b/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java index 3666889d248df..e1dd1a69158bd 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java +++ b/packages/SystemUI/src/com/android/systemui/complication/ComplicationLayoutEngine.java @@ -16,9 +16,21 @@ package com.android.systemui.complication; +import static com.android.systemui.complication.ComplicationLayoutParams.DIRECTION_DOWN; +import static com.android.systemui.complication.ComplicationLayoutParams.DIRECTION_END; +import static com.android.systemui.complication.ComplicationLayoutParams.DIRECTION_START; +import static com.android.systemui.complication.ComplicationLayoutParams.DIRECTION_UP; +import static com.android.systemui.complication.ComplicationLayoutParams.POSITION_BOTTOM; +import static com.android.systemui.complication.ComplicationLayoutParams.POSITION_END; +import static com.android.systemui.complication.ComplicationLayoutParams.POSITION_START; +import static com.android.systemui.complication.ComplicationLayoutParams.POSITION_TOP; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATIONS_FADE_IN_DURATION; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATIONS_FADE_OUT_DURATION; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_DIRECTIONAL_SPACING_DEFAULT; +import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_BOTTOM; +import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_END; +import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_START; +import static com.android.systemui.complication.dagger.ComplicationHostViewModule.COMPLICATION_MARGIN_POSITION_TOP; import static com.android.systemui.complication.dagger.ComplicationHostViewModule.SCOPED_COMPLICATIONS_LAYOUT; import android.util.Log; @@ -29,6 +41,7 @@ import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.Constraints; import com.android.systemui.R; +import com.android.systemui.complication.ComplicationLayoutParams.Direction; import com.android.systemui.complication.ComplicationLayoutParams.Position; import com.android.systemui.complication.dagger.ComplicationModule; import com.android.systemui.statusbar.CrossFadeHelper; @@ -83,6 +96,16 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll this.end = end; this.bottom = bottom; } + + /** + * Creates a new {@link Margins} by adding the corresponding dimensions together. + */ + public static Margins combine(Margins margins1, Margins margins2) { + return new Margins(margins1.start + margins2.start, + margins1.top + margins2.top, + margins1.end + margins2.end, + margins1.bottom + margins2.bottom); + } } /** @@ -220,7 +243,7 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll break; } - final Margins margins = mParent.getMargins(this); + final Margins margins = mParent.getMargins(this, isRoot); params.setMarginsRelative(margins.start, margins.top, margins.end, margins.bottom); }); @@ -342,7 +365,7 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll /** * Returns the margins to be applied to the entry */ - Margins getMargins(ViewEntry entry); + Margins getMargins(ViewEntry entry, boolean isRoot); } } @@ -354,10 +377,13 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll private static class PositionGroup implements DirectionGroup.Parent { private final HashMap mDirectionGroups = new HashMap<>(); + private final HashMap mDirectionalMargins; + private final int mDefaultDirectionalSpacing; - PositionGroup(int defaultDirectionalSpacing) { + PositionGroup(int defaultDirectionalSpacing, HashMap directionalMargins) { mDefaultDirectionalSpacing = defaultDirectionalSpacing; + mDirectionalMargins = directionalMargins; } /** @@ -369,7 +395,7 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll public ViewEntry add(ViewEntry.Builder entryBuilder) { final int direction = entryBuilder.getLayoutParams().getDirection(); if (!mDirectionGroups.containsKey(direction)) { - mDirectionGroups.put(direction, new DirectionGroup(this, direction)); + mDirectionGroups.put(direction, new DirectionGroup(this)); } return mDirectionGroups.get(direction).add(entryBuilder); @@ -388,6 +414,21 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll return mDefaultDirectionalSpacing; } + @Override + public Margins getMargins(ViewEntry entry, boolean isRoot) { + if (isRoot) { + Margins cumulativeMargins = new Margins(); + + for (Margins margins : mDirectionalMargins.values()) { + cumulativeMargins = Margins.combine(margins, cumulativeMargins); + } + + return cumulativeMargins; + } + + return mDirectionalMargins.get(entry.getLayoutParams().getDirection()); + } + private void updateViews() { ViewEntry head = null; @@ -440,17 +481,20 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll * Returns the default spacing between elements. */ int getDefaultDirectionalSpacing(); + + /** + * Returns the margins for the view entry. + */ + Margins getMargins(ViewEntry entry, boolean isRoot); } private final ArrayList mViews = new ArrayList<>(); private final Parent mParent; - private final int mDirection; /** * Creates a new {@link DirectionGroup} with the specified parent. */ - DirectionGroup(Parent parent, int direction) { + DirectionGroup(Parent parent) { mParent = parent; - mDirection = direction; } /** @@ -487,14 +531,14 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll } @Override - public Margins getMargins(ViewEntry entry) { + public Margins getMargins(ViewEntry entry, boolean isRoot) { int directionalSpacing = entry.getLayoutParams().getDirectionalSpacing( mParent.getDefaultDirectionalSpacing()); Margins margins = new Margins(); - if (getHead() != entry) { - switch (mDirection) { + if (!isRoot) { + switch (entry.getLayoutParams().getDirection()) { case ComplicationLayoutParams.DIRECTION_START: margins = new Margins(0, 0, directionalSpacing, 0); break; @@ -510,7 +554,7 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll } } - return margins; + return Margins.combine(mParent.getMargins(entry, isRoot), margins); } /** @@ -540,11 +584,16 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll private final TouchInsetManager.TouchInsetSession mSession; private final int mFadeInDuration; private final int mFadeOutDuration; + private final HashMap> mPositionDirectionMarginMapping; /** */ @Inject public ComplicationLayoutEngine(@Named(SCOPED_COMPLICATIONS_LAYOUT) ConstraintLayout layout, @Named(COMPLICATION_DIRECTIONAL_SPACING_DEFAULT) int defaultDirectionalSpacing, + @Named(COMPLICATION_MARGIN_POSITION_START) int complicationMarginPositionStart, + @Named(COMPLICATION_MARGIN_POSITION_TOP) int complicationMarginPositionTop, + @Named(COMPLICATION_MARGIN_POSITION_END) int complicationMarginPositionEnd, + @Named(COMPLICATION_MARGIN_POSITION_BOTTOM) int complicationMarginPositionBottom, TouchInsetManager.TouchInsetSession session, @Named(COMPLICATIONS_FADE_IN_DURATION) int fadeInDuration, @Named(COMPLICATIONS_FADE_OUT_DURATION) int fadeOutDuration) { @@ -553,6 +602,46 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll mSession = session; mFadeInDuration = fadeInDuration; mFadeOutDuration = fadeOutDuration; + mPositionDirectionMarginMapping = generatePositionDirectionalMarginsMapping( + complicationMarginPositionStart, + complicationMarginPositionTop, + complicationMarginPositionEnd, + complicationMarginPositionBottom); + } + + private static HashMap> + generatePositionDirectionalMarginsMapping(int complicationMarginPositionStart, + int complicationMarginPositionTop, + int complicationMarginPositionEnd, + int complicationMarginPositionBottom) { + HashMap> mapping = new HashMap<>(); + + final Margins startMargins = new Margins(complicationMarginPositionStart, 0, 0, 0); + final Margins topMargins = new Margins(0, complicationMarginPositionTop, 0, 0); + final Margins endMargins = new Margins(0, 0, complicationMarginPositionEnd, 0); + final Margins bottomMargins = new Margins(0, 0, 0, complicationMarginPositionBottom); + + addToMapping(mapping, POSITION_START | POSITION_TOP, DIRECTION_END, topMargins); + addToMapping(mapping, POSITION_START | POSITION_TOP, DIRECTION_DOWN, startMargins); + + addToMapping(mapping, POSITION_START | POSITION_BOTTOM, DIRECTION_END, bottomMargins); + addToMapping(mapping, POSITION_START | POSITION_BOTTOM, DIRECTION_UP, startMargins); + + addToMapping(mapping, POSITION_END | POSITION_TOP, DIRECTION_START, topMargins); + addToMapping(mapping, POSITION_END | POSITION_TOP, DIRECTION_DOWN, endMargins); + + addToMapping(mapping, POSITION_END | POSITION_BOTTOM, DIRECTION_START, bottomMargins); + addToMapping(mapping, POSITION_END | POSITION_BOTTOM, DIRECTION_UP, endMargins); + + return mapping; + } + + private static void addToMapping(HashMap> mapping, + @Position int position, @Direction int direction, Margins margins) { + if (!mapping.containsKey(position)) { + mapping.put(position, new HashMap<>()); + } + mapping.get(position).put(direction, margins); } @Override @@ -592,7 +681,8 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll // Add position group if doesn't already exist final int position = lp.getPosition(); if (!mPositions.containsKey(position)) { - mPositions.put(position, new PositionGroup(mDefaultDirectionalSpacing)); + mPositions.put(position, new PositionGroup(mDefaultDirectionalSpacing, + mPositionDirectionMarginMapping.get(lp.getPosition()))); } // Insert entry into group diff --git a/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java b/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java index 7ff69b77025e9..a7d017dda21e3 100644 --- a/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/complication/dagger/ComplicationHostViewModule.java @@ -42,6 +42,14 @@ public abstract class ComplicationHostViewModule { public static final String COMPLICATIONS_FADE_IN_DURATION = "complications_fade_in_duration"; public static final String COMPLICATIONS_RESTORE_TIMEOUT = "complication_restore_timeout"; public static final String COMPLICATIONS_FADE_OUT_DELAY = "complication_fade_out_delay"; + public static final String COMPLICATION_MARGIN_POSITION_START = + "complication_margin_position_start"; + public static final String COMPLICATION_MARGIN_POSITION_TOP = + "complication_margin_position_top"; + public static final String COMPLICATION_MARGIN_POSITION_END = + "complication_margin_position_end"; + public static final String COMPLICATION_MARGIN_POSITION_BOTTOM = + "complication_margin_position_bottom"; /** * Generates a {@link ConstraintLayout}, which can host @@ -64,6 +72,30 @@ public abstract class ComplicationHostViewModule { return resources.getDimensionPixelSize(R.dimen.dream_overlay_complication_margin); } + @Provides + @Named(COMPLICATION_MARGIN_POSITION_START) + static int providesComplicationMarginPositionStart(@Main Resources resources) { + return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_start); + } + + @Provides + @Named(COMPLICATION_MARGIN_POSITION_TOP) + static int providesComplicationMarginPositionTop(@Main Resources resources) { + return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_top); + } + + @Provides + @Named(COMPLICATION_MARGIN_POSITION_END) + static int providesComplicationMarginPositionEnd(@Main Resources resources) { + return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_end); + } + + @Provides + @Named(COMPLICATION_MARGIN_POSITION_BOTTOM) + static int providesComplicationMarginPositionBottom(@Main Resources resources) { + return resources.getDimensionPixelSize(R.dimen.dream_overlay_container_padding_bottom); + } + /** * Provides the fade out duration for complications. */ diff --git a/packages/SystemUI/tests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java b/packages/SystemUI/tests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java index a1d4fb4dd5832..69d8d0b6f0915 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/complication/ComplicationLayoutEngineTest.java @@ -30,6 +30,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.complication.ComplicationLayoutEngine.Margins; import com.android.systemui.touch.TouchInsetManager; import org.junit.Before; @@ -42,6 +43,7 @@ import org.mockito.MockitoAnnotations; import java.util.Arrays; import java.util.List; +import java.util.Random; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -54,6 +56,14 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Mock TouchInsetManager.TouchInsetSession mTouchSession; + ComplicationLayoutEngine createComplicationLayoutEngine() { + return createComplicationLayoutEngine(0); + } + + ComplicationLayoutEngine createComplicationLayoutEngine(int spacing) { + return new ComplicationLayoutEngine(mLayout, spacing, 0, 0, 0, 0, mTouchSession, 0, 0); + } + @Before public void setup() { MockitoAnnotations.initMocks(this); @@ -104,6 +114,73 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { engine.addComplication(info.id, info.view, info.lp, info.category); } + @Test + public void testCombineMargins() { + final Random rand = new Random(); + final Margins margins1 = new Margins(rand.nextInt(), rand.nextInt(), rand.nextInt(), + rand.nextInt()); + final Margins margins2 = new Margins(rand.nextInt(), rand.nextInt(), rand.nextInt(), + rand.nextInt()); + final Margins combined = Margins.combine(margins1, margins2); + assertThat(margins1.start + margins2.start).isEqualTo(combined.start); + assertThat(margins1.top + margins2.top).isEqualTo(combined.top); + assertThat(margins1.end + margins2.end).isEqualTo(combined.end); + assertThat(margins1.bottom + margins2.bottom).isEqualTo(combined.bottom); + } + + @Test + public void testComplicationMarginPosition() { + final Random rand = new Random(); + final int startMargin = rand.nextInt(); + final int topMargin = rand.nextInt(); + final int endMargin = rand.nextInt(); + final int bottomMargin = rand.nextInt(); + final int spacing = rand.nextInt(); + + final ComplicationLayoutEngine engine = new ComplicationLayoutEngine(mLayout, spacing, + startMargin, topMargin, endMargin, bottomMargin, mTouchSession, 0, 0); + + final ViewInfo firstViewInfo = new ViewInfo( + new ComplicationLayoutParams( + 100, + 100, + ComplicationLayoutParams.POSITION_TOP + | ComplicationLayoutParams.POSITION_END, + ComplicationLayoutParams.DIRECTION_DOWN, + 0), + Complication.CATEGORY_SYSTEM, + mLayout); + + addComplication(engine, firstViewInfo); + firstViewInfo.clearInvocations(); + + final ViewInfo secondViewInfo = new ViewInfo( + new ComplicationLayoutParams( + 100, + 100, + ComplicationLayoutParams.POSITION_TOP + | ComplicationLayoutParams.POSITION_END, + ComplicationLayoutParams.DIRECTION_DOWN, + 0), + Complication.CATEGORY_STANDARD, + mLayout); + + addComplication(engine, secondViewInfo); + + + // The first added view should have margins from both directions from the corner position. + verifyChange(firstViewInfo, false, lp -> { + assertThat(lp.topMargin).isEqualTo(topMargin); + assertThat(lp.getMarginEnd()).isEqualTo(endMargin); + }); + + // The second view should be spaced below the first view and have the side end margin. + verifyChange(secondViewInfo, false, lp -> { + assertThat(lp.topMargin).isEqualTo(spacing); + assertThat(lp.getMarginEnd()).isEqualTo(endMargin); + }); + } + /** * Makes sure the engine properly places a view within the {@link ConstraintLayout}. */ @@ -120,8 +197,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { Complication.CATEGORY_STANDARD, mLayout); - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); addComplication(engine, firstViewInfo); // Ensure the view is added to the top end corner @@ -148,8 +224,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { Complication.CATEGORY_STANDARD, mLayout); - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); addComplication(engine, firstViewInfo); // Ensure the view is added to the top end corner @@ -165,8 +240,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { */ @Test public void testDirectionLayout() { - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( @@ -214,8 +288,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { */ @Test public void testPositionLayout() { - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( @@ -302,8 +375,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testDefaultMargin() { final int margin = 5; - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, margin, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(margin); final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( @@ -379,8 +451,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { public void testComplicationMargin() { final int defaultMargin = 5; final int complicationMargin = 10; - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, defaultMargin, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(defaultMargin); final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( @@ -446,8 +517,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testWidthConstraint() { final int maxWidth = 20; - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo viewStartDirection = new ViewInfo( new ComplicationLayoutParams( @@ -495,8 +565,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testHeightConstraint() { final int maxHeight = 20; - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo viewUpDirection = new ViewInfo( new ComplicationLayoutParams( @@ -543,8 +612,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { */ @Test public void testConstraintNotSetWhenNotSpecified() { - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo view = new ViewInfo( new ComplicationLayoutParams( @@ -572,8 +640,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { */ @Test public void testRemoval() { - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( @@ -619,8 +686,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { */ @Test public void testDoubleRemoval() { - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo firstViewInfo = new ViewInfo( new ComplicationLayoutParams( @@ -649,8 +715,7 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase { @Test public void testGetViews() { - final ComplicationLayoutEngine engine = - new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0); + final ComplicationLayoutEngine engine = createComplicationLayoutEngine(); final ViewInfo topEndView = new ViewInfo( new ComplicationLayoutParams(