Merge "Hiding split shade status bar for heads up notifications" into sc-v2-dev am: 6366f4e22a
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16056792 Change-Id: Iadf742d4113f945eca94478477f68caf2683a36c
This commit is contained in:
@@ -197,26 +197,6 @@ public class Interpolators {
|
|||||||
return MathUtils.max(0.0f, (float) (1.0f - Math.exp(-4 * progress)));
|
return MathUtils.max(0.0f, (float) (1.0f - Math.exp(-4 * progress)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Interpolate alpha for notifications background scrim during shade expansion.
|
|
||||||
* @param fraction Shade expansion fraction
|
|
||||||
* @param forUiContent If we want the alpha of the scrims, or ui that's on top of them.
|
|
||||||
*/
|
|
||||||
public static float getNotificationScrimAlpha(float fraction, boolean forUiContent) {
|
|
||||||
if (forUiContent) {
|
|
||||||
fraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction);
|
|
||||||
} else {
|
|
||||||
fraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction);
|
|
||||||
}
|
|
||||||
fraction = fraction * 1.2f - 0.2f;
|
|
||||||
if (fraction <= 0) {
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
final float oneMinusFrac = 1f - fraction;
|
|
||||||
return (float) (1f - 0.5f * (1f - Math.cos(3.14159f * oneMinusFrac * oneMinusFrac)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the default emphasized interpolator
|
// Create the default emphasized interpolator
|
||||||
private static PathInterpolator createEmphasizedInterpolator() {
|
private static PathInterpolator createEmphasizedInterpolator() {
|
||||||
Path path = new Path();
|
Path path = new Path();
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
package com.android.systemui.animation
|
||||||
|
|
||||||
|
import android.util.MathUtils
|
||||||
|
|
||||||
|
object ShadeInterpolation {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interpolate alpha for notification background scrim during shade expansion.
|
||||||
|
* @param fraction Shade expansion fraction
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun getNotificationScrimAlpha(fraction: Float): Float {
|
||||||
|
val mappedFraction = MathUtils.constrainedMap(0f, 1f, 0f, 0.5f, fraction)
|
||||||
|
return interpolateEaseInOut(mappedFraction)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interpolate alpha for shade content during shade expansion.
|
||||||
|
* @param fraction Shade expansion fraction
|
||||||
|
*/
|
||||||
|
@JvmStatic
|
||||||
|
fun getContentAlpha(fraction: Float): Float {
|
||||||
|
val mappedFraction = MathUtils.constrainedMap(0f, 1f, 0.3f, 1f, fraction)
|
||||||
|
return interpolateEaseInOut(mappedFraction)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun interpolateEaseInOut(fraction: Float): Float {
|
||||||
|
val mappedFraction = fraction * 1.2f - 0.2f
|
||||||
|
return if (mappedFraction <= 0) {
|
||||||
|
0f
|
||||||
|
} else {
|
||||||
|
val oneMinusFrac = 1f - mappedFraction
|
||||||
|
(1f - 0.5f * (1f - Math.cos((3.14159f * oneMinusFrac * oneMinusFrac).toDouble())))
|
||||||
|
.toFloat()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -40,6 +40,7 @@ import androidx.annotation.VisibleForTesting;
|
|||||||
import com.android.systemui.Dumpable;
|
import com.android.systemui.Dumpable;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.animation.Interpolators;
|
import com.android.systemui.animation.Interpolators;
|
||||||
|
import com.android.systemui.animation.ShadeInterpolation;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
import com.android.systemui.media.MediaHost;
|
import com.android.systemui.media.MediaHost;
|
||||||
import com.android.systemui.plugins.FalsingManager;
|
import com.android.systemui.plugins.FalsingManager;
|
||||||
@@ -574,7 +575,7 @@ public class QSFragment extends LifecycleFragment implements QS, CommandQueue.Ca
|
|||||||
} else if (progress > 0 && view.getVisibility() != View.VISIBLE) {
|
} else if (progress > 0 && view.getVisibility() != View.VISIBLE) {
|
||||||
view.setVisibility((View.VISIBLE));
|
view.setVisibility((View.VISIBLE));
|
||||||
}
|
}
|
||||||
float alpha = Interpolators.getNotificationScrimAlpha(progress, true /* uiContent */);
|
float alpha = ShadeInterpolation.getContentAlpha(progress);
|
||||||
view.setAlpha(alpha);
|
view.setAlpha(alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ import androidx.dynamicanimation.animation.SpringAnimation
|
|||||||
import androidx.dynamicanimation.animation.SpringForce
|
import androidx.dynamicanimation.animation.SpringForce
|
||||||
import com.android.systemui.Dumpable
|
import com.android.systemui.Dumpable
|
||||||
import com.android.systemui.animation.Interpolators
|
import com.android.systemui.animation.Interpolators
|
||||||
|
import com.android.systemui.animation.ShadeInterpolation
|
||||||
import com.android.systemui.dagger.SysUISingleton
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||||
@@ -184,12 +185,12 @@ class NotificationShadeDepthController @Inject constructor(
|
|||||||
val animationRadius = MathUtils.constrain(shadeAnimation.radius,
|
val animationRadius = MathUtils.constrain(shadeAnimation.radius,
|
||||||
blurUtils.minBlurRadius.toFloat(), blurUtils.maxBlurRadius.toFloat())
|
blurUtils.minBlurRadius.toFloat(), blurUtils.maxBlurRadius.toFloat())
|
||||||
val expansionRadius = blurUtils.blurRadiusOfRatio(
|
val expansionRadius = blurUtils.blurRadiusOfRatio(
|
||||||
Interpolators.getNotificationScrimAlpha(
|
ShadeInterpolation.getNotificationScrimAlpha(
|
||||||
if (shouldApplyShadeBlur()) shadeExpansion else 0f, false))
|
if (shouldApplyShadeBlur()) shadeExpansion else 0f))
|
||||||
var combinedBlur = (expansionRadius * INTERACTION_BLUR_FRACTION +
|
var combinedBlur = (expansionRadius * INTERACTION_BLUR_FRACTION +
|
||||||
animationRadius * ANIMATION_BLUR_FRACTION)
|
animationRadius * ANIMATION_BLUR_FRACTION)
|
||||||
val qsExpandedRatio = Interpolators.getNotificationScrimAlpha(qsPanelExpansion,
|
val qsExpandedRatio = ShadeInterpolation.getNotificationScrimAlpha(qsPanelExpansion) *
|
||||||
false /* notification */) * shadeExpansion
|
shadeExpansion
|
||||||
combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsExpandedRatio))
|
combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsExpandedRatio))
|
||||||
combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(transitionToFullShadeProgress))
|
combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(transitionToFullShadeProgress))
|
||||||
var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius)
|
var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import android.view.animation.PathInterpolator;
|
|||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.animation.Interpolators;
|
import com.android.systemui.animation.ShadeInterpolation;
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
|
import com.android.systemui.plugins.statusbar.StatusBarStateController.StateListener;
|
||||||
import com.android.systemui.statusbar.notification.NotificationUtils;
|
import com.android.systemui.statusbar.notification.NotificationUtils;
|
||||||
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
|
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
|
||||||
@@ -168,8 +168,8 @@ public class NotificationShelf extends ActivatableNotificationView implements
|
|||||||
viewState.clipTopAmount = 0;
|
viewState.clipTopAmount = 0;
|
||||||
|
|
||||||
if (ambientState.isExpansionChanging() && !ambientState.isOnKeyguard()) {
|
if (ambientState.isExpansionChanging() && !ambientState.isOnKeyguard()) {
|
||||||
viewState.alpha = Interpolators.getNotificationScrimAlpha(
|
float expansion = ambientState.getExpansionFraction();
|
||||||
ambientState.getExpansionFraction(), true /* notification */);
|
viewState.alpha = ShadeInterpolation.getContentAlpha(expansion);
|
||||||
} else {
|
} else {
|
||||||
viewState.alpha = 1f - ambientState.getHideAmount();
|
viewState.alpha = 1f - ambientState.getHideAmount();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import android.view.ViewGroup;
|
|||||||
import androidx.annotation.VisibleForTesting;
|
import androidx.annotation.VisibleForTesting;
|
||||||
|
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.animation.Interpolators;
|
import com.android.systemui.animation.ShadeInterpolation;
|
||||||
import com.android.systemui.statusbar.NotificationShelf;
|
import com.android.systemui.statusbar.NotificationShelf;
|
||||||
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
|
import com.android.systemui.statusbar.notification.row.ActivatableNotificationView;
|
||||||
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
|
import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow;
|
||||||
@@ -408,8 +408,8 @@ public class StackScrollAlgorithm {
|
|||||||
viewState.alpha = 1f - ambientState.getHideAmount();
|
viewState.alpha = 1f - ambientState.getHideAmount();
|
||||||
} else if (ambientState.isExpansionChanging()) {
|
} else if (ambientState.isExpansionChanging()) {
|
||||||
// Adjust alpha for shade open & close.
|
// Adjust alpha for shade open & close.
|
||||||
viewState.alpha = Interpolators.getNotificationScrimAlpha(
|
float expansion = ambientState.getExpansionFraction();
|
||||||
ambientState.getExpansionFraction(), true /* notification */);
|
viewState.alpha = ShadeInterpolation.getContentAlpha(expansion);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ambientState.isShadeExpanded() && view.mustStayOnScreen()
|
if (ambientState.isShadeExpanded() && view.mustStayOnScreen()
|
||||||
|
|||||||
@@ -1247,6 +1247,7 @@ public class NotificationPanelViewController extends PanelViewController {
|
|||||||
stackScrollerPadding = mClockPositionResult.stackScrollerPaddingExpanded;
|
stackScrollerPadding = mClockPositionResult.stackScrollerPaddingExpanded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mSplitShadeHeaderController.setShadeExpandedFraction(getExpandedFraction());
|
||||||
mNotificationStackScrollLayoutController.setIntrinsicPadding(stackScrollerPadding);
|
mNotificationStackScrollLayoutController.setIntrinsicPadding(stackScrollerPadding);
|
||||||
mKeyguardBottomArea.setAntiBurnInOffsetX(mClockPositionResult.clockX);
|
mKeyguardBottomArea.setAntiBurnInOffsetX(mClockPositionResult.clockX);
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ import com.android.settingslib.Utils;
|
|||||||
import com.android.systemui.DejankUtils;
|
import com.android.systemui.DejankUtils;
|
||||||
import com.android.systemui.Dumpable;
|
import com.android.systemui.Dumpable;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.animation.Interpolators;
|
import com.android.systemui.animation.ShadeInterpolation;
|
||||||
import com.android.systemui.dagger.SysUISingleton;
|
import com.android.systemui.dagger.SysUISingleton;
|
||||||
import com.android.systemui.dagger.qualifiers.Main;
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.dock.DockManager;
|
import com.android.systemui.dock.DockManager;
|
||||||
@@ -579,8 +579,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
|||||||
if (isNaN(expansionFraction)) {
|
if (isNaN(expansionFraction)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
expansionFraction = Interpolators
|
expansionFraction = ShadeInterpolation.getNotificationScrimAlpha(expansionFraction);
|
||||||
.getNotificationScrimAlpha(expansionFraction, false /* notification */);
|
|
||||||
boolean qsBottomVisible = qsPanelBottomY > 0;
|
boolean qsBottomVisible = qsPanelBottomY > 0;
|
||||||
if (mQsExpansion != expansionFraction || mQsBottomVisible != qsBottomVisible) {
|
if (mQsExpansion != expansionFraction || mQsBottomVisible != qsBottomVisible) {
|
||||||
mQsExpansion = expansionFraction;
|
mQsExpansion = expansionFraction;
|
||||||
@@ -915,8 +914,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump
|
|||||||
}
|
}
|
||||||
|
|
||||||
private float getInterpolatedFraction() {
|
private float getInterpolatedFraction() {
|
||||||
return Interpolators.getNotificationScrimAlpha(
|
return ShadeInterpolation.getNotificationScrimAlpha(mPanelExpansionFraction);
|
||||||
mPanelExpansionFraction, false /* notification */);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setScrimAlpha(ScrimView scrim, float alpha) {
|
private void setScrimAlpha(ScrimView scrim, float alpha) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone
|
|||||||
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import com.android.systemui.R
|
import com.android.systemui.R
|
||||||
|
import com.android.systemui.animation.ShadeInterpolation
|
||||||
import com.android.systemui.battery.BatteryMeterView
|
import com.android.systemui.battery.BatteryMeterView
|
||||||
import com.android.systemui.battery.BatteryMeterViewController
|
import com.android.systemui.battery.BatteryMeterViewController
|
||||||
import com.android.systemui.flags.FeatureFlags
|
import com.android.systemui.flags.FeatureFlags
|
||||||
@@ -53,6 +54,14 @@ class SplitShadeHeaderController @Inject constructor(
|
|||||||
updateVisibility()
|
updateVisibility()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var shadeExpandedFraction = -1f
|
||||||
|
set(value) {
|
||||||
|
if (visible && field != value) {
|
||||||
|
statusBar.alpha = ShadeInterpolation.getContentAlpha(value)
|
||||||
|
field = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
init {
|
init {
|
||||||
batteryMeterViewController.init()
|
batteryMeterViewController.init()
|
||||||
val batteryIcon: BatteryMeterView = statusBar.findViewById(R.id.batteryRemainingIcon)
|
val batteryIcon: BatteryMeterView = statusBar.findViewById(R.id.batteryRemainingIcon)
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ import android.view.View
|
|||||||
import android.view.ViewRootImpl
|
import android.view.ViewRootImpl
|
||||||
import androidx.test.filters.SmallTest
|
import androidx.test.filters.SmallTest
|
||||||
import com.android.systemui.SysuiTestCase
|
import com.android.systemui.SysuiTestCase
|
||||||
import com.android.systemui.animation.Interpolators
|
import com.android.systemui.animation.ShadeInterpolation
|
||||||
import com.android.systemui.dump.DumpManager
|
import com.android.systemui.dump.DumpManager
|
||||||
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
import com.android.systemui.plugins.statusbar.StatusBarStateController
|
||||||
import com.android.systemui.statusbar.phone.BiometricUnlockController
|
import com.android.systemui.statusbar.phone.BiometricUnlockController
|
||||||
@@ -208,7 +208,7 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() {
|
|||||||
notificationShadeDepthController.onPanelExpansionChanged(1f, tracking = false)
|
notificationShadeDepthController.onPanelExpansionChanged(1f, tracking = false)
|
||||||
notificationShadeDepthController.updateBlurCallback.doFrame(0)
|
notificationShadeDepthController.updateBlurCallback.doFrame(0)
|
||||||
verify(wallpaperController).setNotificationShadeZoom(
|
verify(wallpaperController).setNotificationShadeZoom(
|
||||||
eq(Interpolators.getNotificationScrimAlpha(0.25f, false /* notifications */)))
|
eq(ShadeInterpolation.getNotificationScrimAlpha(0.25f)))
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user