diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 7702724cec16e..851c6ddc2f862 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -1429,6 +1429,8 @@
0dp
+ 80dp
+
0dp
diff --git a/packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt b/packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt
index 497d81f6bdc5c..1b2ea3b257abb 100644
--- a/packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt
+++ b/packages/SystemUI/src/com/android/keyguard/BouncerPanelExpansionCalculator.kt
@@ -46,4 +46,24 @@ object BouncerPanelExpansionCalculator {
fun getKeyguardClockScaledExpansion(fraction: Float): Float {
return MathUtils.constrain((fraction - 0.7f) / 0.3f, 0f, 1f)
}
+
+ /**
+ * Scale the position of the dream complications.
+ */
+ @JvmStatic
+ fun getDreamYPositionScaledExpansion(fraction: Float): Float {
+ return when {
+ fraction >= 0.98f -> 1f
+ fraction < 0.93 -> 0f
+ else -> (fraction - 0.93f) / 0.05f
+ }
+ }
+
+ /**
+ * Scale the alpha of the dream complications.
+ */
+ @JvmStatic
+ fun getDreamAlphaScaledExpansion(fraction: Float): Float {
+ return MathUtils.constrain((fraction - 0.94f) / 0.06f, 0f, 1f)
+ }
}
\ No newline at end of file
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
index 456119068b93d..fb1af8b66b913 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/DreamOverlayContainerViewController.java
@@ -16,14 +16,21 @@
package com.android.systemui.dreams;
+import static com.android.keyguard.BouncerPanelExpansionCalculator.getBackScrimScaledExpansion;
+import static com.android.keyguard.BouncerPanelExpansionCalculator.getDreamAlphaScaledExpansion;
+import static com.android.keyguard.BouncerPanelExpansionCalculator.getDreamYPositionScaledExpansion;
import static com.android.systemui.doze.util.BurnInHelperKt.getBurnInOffset;
+import static com.android.systemui.dreams.complication.ComplicationLayoutParams.POSITION_BOTTOM;
+import static com.android.systemui.dreams.complication.ComplicationLayoutParams.POSITION_TOP;
+import android.content.res.Resources;
import android.os.Handler;
import android.util.MathUtils;
import android.view.View;
import android.view.ViewGroup;
-import com.android.keyguard.BouncerPanelExpansionCalculator;
+import com.android.systemui.R;
+import com.android.systemui.animation.Interpolators;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dreams.complication.ComplicationHostViewController;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
@@ -33,6 +40,8 @@ import com.android.systemui.statusbar.phone.KeyguardBouncer;
import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager;
import com.android.systemui.util.ViewController;
+import java.util.Arrays;
+
import javax.inject.Inject;
import javax.inject.Named;
@@ -63,6 +72,7 @@ public class DreamOverlayContainerViewController extends ViewController {
+ v.setAlpha(alpha);
+ v.setTranslationY(translationY);
+ });
+ }
+
+ mBlurUtils.applyBlur(mView.getViewRootImpl(),
+ (int) mBlurUtils.blurRadiusOfRatio(
+ 1 - getBackScrimScaledExpansion(bouncerHideAmount)), false);
+ }
+
+ private static float getAlpha(int position, float expansion) {
+ return Interpolators.LINEAR_OUT_SLOW_IN.getInterpolation(
+ position == POSITION_TOP ? getDreamAlphaScaledExpansion(expansion)
+ : getBackScrimScaledExpansion(expansion + 0.03f));
+ }
+
+ private float getTranslationY(int position, float expansion) {
+ final float fraction = Interpolators.LINEAR_OUT_SLOW_IN.getInterpolation(
+ position == POSITION_TOP ? getDreamYPositionScaledExpansion(expansion)
+ : getBackScrimScaledExpansion(expansion + 0.03f));
+ return MathUtils.lerp(-mDreamOverlayMaxTranslationY, 0, fraction);
}
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java
index 4e528bbe9386f..4c0154faeb5a4 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationHostViewController.java
@@ -31,6 +31,7 @@ import com.android.systemui.util.ViewController;
import java.util.Collection;
import java.util.HashMap;
+import java.util.List;
import java.util.stream.Collectors;
import javax.inject.Inject;
@@ -144,4 +145,11 @@ public class ComplicationHostViewController extends ViewController getViewsAtPosition(@ComplicationLayoutParams.Position int position) {
+ return mLayoutEngine.getViewsAtPosition(position);
+ }
}
diff --git a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java
index 4065a25dac803..ded61a8b80d9b 100644
--- a/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java
+++ b/packages/SystemUI/src/com/android/systemui/dreams/complication/ComplicationLayoutEngine.java
@@ -32,6 +32,7 @@ import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.Constraints;
import com.android.systemui.R;
+import com.android.systemui.dreams.complication.ComplicationLayoutParams.Position;
import com.android.systemui.dreams.dagger.DreamOverlayComponent;
import com.android.systemui.touch.TouchInsetManager;
@@ -39,7 +40,9 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.function.Consumer;
+import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Named;
@@ -378,6 +381,14 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll
directionGroup.updateViews(head.getView());
}
}
+
+ private ArrayList getViews() {
+ final ArrayList views = new ArrayList<>();
+ for (DirectionGroup directionGroup : mDirectionGroups.values()) {
+ views.addAll(directionGroup.getViews());
+ }
+ return views;
+ }
}
/**
@@ -454,6 +465,10 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll
groupHead = viewEntry.getView();
}
}
+
+ private List getViews() {
+ return mViews;
+ }
}
private final ConstraintLayout mLayout;
@@ -551,4 +566,15 @@ public class ComplicationLayoutEngine implements Complication.VisibilityControll
entry.remove();
return true;
}
+
+ /**
+ * Gets an unordered list of all the views at a particular position.
+ */
+ public List getViewsAtPosition(@Position int position) {
+ return mPositions.entrySet().stream()
+ .filter(entry -> (entry.getKey() & position) == position)
+ .flatMap(entry -> entry.getValue().getViews().stream())
+ .map(ViewEntry::getView)
+ .collect(Collectors.toList());
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
index 76f6529e38948..6453c204342ca 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/DreamOverlayContainerViewControllerTest.java
@@ -107,6 +107,7 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
mStatusBarKeyguardViewManager,
mBlurUtils,
mHandler,
+ mResources,
MAX_BURN_IN_OFFSET,
BURN_IN_PROTECTION_UPDATE_INTERVAL,
MILLIS_UNTIL_FULL_JITTER);
@@ -160,11 +161,10 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
bouncerExpansionCaptor.getValue().onExpansionChanged(0.5f);
verify(mBlurUtils, never()).applyBlur(eq(mViewRoot), anyInt(), eq(false));
- verify(mDreamOverlayContainerView, never()).setAlpha(anyFloat());
}
@Test
- public void testBouncerAnimation_updateBlurAndAlpha() {
+ public void testBouncerAnimation_updateBlur() {
final ArgumentCaptor bouncerExpansionCaptor =
ArgumentCaptor.forClass(BouncerExpansionCallback.class);
mController.onViewAttached();
@@ -182,6 +182,5 @@ public class DreamOverlayContainerViewControllerTest extends SysuiTestCase {
bouncerExpansionCaptor.getValue().onExpansionChanged(bouncerHideAmount);
verify(mBlurUtils).blurRadiusOfRatio(1 - scaledFraction);
verify(mBlurUtils).applyBlur(mViewRoot, (int) blurRadius, false);
- verify(mDreamOverlayContainerView).setAlpha(scaledFraction);
}
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java
index 35bcfcd39fca5..2448f1a7633d3 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/complication/ComplicationLayoutEngineTest.java
@@ -40,7 +40,10 @@ import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import java.util.Arrays;
+import java.util.List;
import java.util.function.Consumer;
+import java.util.stream.Collectors;
@SmallTest
@RunWith(AndroidTestingRunner.class)
@@ -448,4 +451,70 @@ public class ComplicationLayoutEngineTest extends SysuiTestCase {
verify(firstViewInfo.view, never()).getParent();
verify(mLayout, never()).removeView(firstViewInfo.view);
}
+
+ @Test
+ public void testGetViews() {
+ final ComplicationLayoutEngine engine =
+ new ComplicationLayoutEngine(mLayout, 0, mTouchSession, 0, 0);
+
+ final ViewInfo topEndView = new ViewInfo(
+ new ComplicationLayoutParams(
+ 100,
+ 100,
+ ComplicationLayoutParams.POSITION_TOP
+ | ComplicationLayoutParams.POSITION_END,
+ ComplicationLayoutParams.DIRECTION_DOWN,
+ 0),
+ Complication.CATEGORY_STANDARD,
+ mLayout);
+
+ addComplication(engine, topEndView);
+
+ final ViewInfo topStartView = new ViewInfo(
+ new ComplicationLayoutParams(
+ 100,
+ 100,
+ ComplicationLayoutParams.POSITION_TOP
+ | ComplicationLayoutParams.POSITION_START,
+ ComplicationLayoutParams.DIRECTION_DOWN,
+ 0),
+ Complication.CATEGORY_SYSTEM,
+ mLayout);
+
+ addComplication(engine, topStartView);
+
+ final ViewInfo bottomEndView = new ViewInfo(
+ new ComplicationLayoutParams(
+ 100,
+ 100,
+ ComplicationLayoutParams.POSITION_BOTTOM
+ | ComplicationLayoutParams.POSITION_END,
+ ComplicationLayoutParams.DIRECTION_START,
+ 1),
+ Complication.CATEGORY_SYSTEM,
+ mLayout);
+
+ addComplication(engine, bottomEndView);
+
+ verifyViewsAtPosition(engine, ComplicationLayoutParams.POSITION_TOP, topStartView,
+ topEndView);
+ verifyViewsAtPosition(engine,
+ ComplicationLayoutParams.POSITION_TOP | ComplicationLayoutParams.POSITION_START,
+ topStartView);
+ verifyViewsAtPosition(engine,
+ ComplicationLayoutParams.POSITION_BOTTOM,
+ bottomEndView);
+ }
+
+ private void verifyViewsAtPosition(ComplicationLayoutEngine engine, int position,
+ ViewInfo... views) {
+ final List idList = engine.getViewsAtPosition(position).stream()
+ .map(View::getId)
+ .collect(Collectors.toList());
+
+ assertThat(idList).containsExactlyElementsIn(
+ Arrays.stream(views)
+ .map(viewInfo -> viewInfo.view.getId())
+ .collect(Collectors.toList()));
+ }
}