DO NOT MERGE New back affordance small polish nits
Bug: 268405873 Test: Manual Change-Id: I5f1ef578fc8acd78ceec77aeddd008ebaf252a5d
This commit is contained in:
@@ -2,19 +2,15 @@ package com.android.systemui.navigationbar.gestural
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.res.Configuration
|
import android.content.res.Configuration
|
||||||
import android.content.res.TypedArray
|
|
||||||
import android.graphics.Canvas
|
import android.graphics.Canvas
|
||||||
import android.graphics.Paint
|
import android.graphics.Paint
|
||||||
import android.graphics.Path
|
import android.graphics.Path
|
||||||
import android.graphics.RectF
|
import android.graphics.RectF
|
||||||
import android.util.MathUtils.min
|
import android.util.MathUtils.min
|
||||||
import android.util.TypedValue
|
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.appcompat.view.ContextThemeWrapper
|
|
||||||
import androidx.dynamicanimation.animation.FloatPropertyCompat
|
import androidx.dynamicanimation.animation.FloatPropertyCompat
|
||||||
import androidx.dynamicanimation.animation.SpringAnimation
|
import androidx.dynamicanimation.animation.SpringAnimation
|
||||||
import androidx.dynamicanimation.animation.SpringForce
|
import androidx.dynamicanimation.animation.SpringForce
|
||||||
import com.android.internal.R.style.Theme_DeviceDefault
|
|
||||||
import com.android.internal.util.LatencyTracker
|
import com.android.internal.util.LatencyTracker
|
||||||
import com.android.settingslib.Utils
|
import com.android.settingslib.Utils
|
||||||
import com.android.systemui.navigationbar.gestural.BackPanelController.DelayedOnAnimationEndListener
|
import com.android.systemui.navigationbar.gestural.BackPanelController.DelayedOnAnimationEndListener
|
||||||
@@ -159,26 +155,21 @@ class BackPanel(
|
|||||||
val isDeviceInNightTheme = resources.configuration.uiMode and
|
val isDeviceInNightTheme = resources.configuration.uiMode and
|
||||||
Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
|
Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
|
||||||
|
|
||||||
val colorControlActivated = ContextThemeWrapper(context, Theme_DeviceDefault)
|
arrowPaint.color = Utils.getColorAttrDefaultColor(context,
|
||||||
.run {
|
if (isDeviceInNightTheme) {
|
||||||
val typedValue = TypedValue()
|
com.android.internal.R.attr.colorAccentPrimary
|
||||||
val a: TypedArray = obtainStyledAttributes(typedValue.data,
|
|
||||||
intArrayOf(android.R.attr.colorControlActivated))
|
|
||||||
val color = a.getColor(0, 0)
|
|
||||||
a.recycle()
|
|
||||||
color
|
|
||||||
}
|
|
||||||
|
|
||||||
val colorPrimary =
|
|
||||||
Utils.getColorAttrDefaultColor(context, com.android.internal.R.attr.colorPrimary)
|
|
||||||
|
|
||||||
arrowPaint.color = Utils.getColorAccentDefaultColor(context)
|
|
||||||
|
|
||||||
arrowBackgroundPaint.color = if (isDeviceInNightTheme) {
|
|
||||||
colorPrimary
|
|
||||||
} else {
|
} else {
|
||||||
colorControlActivated
|
com.android.internal.R.attr.textColorPrimary
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
arrowBackgroundPaint.color = Utils.getColorAttrDefaultColor(context,
|
||||||
|
if (isDeviceInNightTheme) {
|
||||||
|
com.android.internal.R.attr.colorSurface
|
||||||
|
} else {
|
||||||
|
com.android.internal.R.attr.colorAccentSecondary
|
||||||
|
}
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
inner class AnimatedFloat(
|
inner class AnimatedFloat(
|
||||||
@@ -414,9 +405,9 @@ class BackPanel(
|
|||||||
) {
|
) {
|
||||||
horizontalTranslation.updateRestingPosition(restingParams.horizontalTranslation)
|
horizontalTranslation.updateRestingPosition(restingParams.horizontalTranslation)
|
||||||
scale.updateRestingPosition(restingParams.scale)
|
scale.updateRestingPosition(restingParams.scale)
|
||||||
arrowAlpha.updateRestingPosition(restingParams.arrowDimens.alpha)
|
|
||||||
backgroundAlpha.updateRestingPosition(restingParams.backgroundDimens.alpha)
|
backgroundAlpha.updateRestingPosition(restingParams.backgroundDimens.alpha)
|
||||||
|
|
||||||
|
arrowAlpha.updateRestingPosition(restingParams.arrowDimens.alpha, animate)
|
||||||
arrowLength.updateRestingPosition(restingParams.arrowDimens.length, animate)
|
arrowLength.updateRestingPosition(restingParams.arrowDimens.length, animate)
|
||||||
arrowHeight.updateRestingPosition(restingParams.arrowDimens.height, animate)
|
arrowHeight.updateRestingPosition(restingParams.arrowDimens.height, animate)
|
||||||
scalePivotX.updateRestingPosition(restingParams.backgroundDimens.width, animate)
|
scalePivotX.updateRestingPosition(restingParams.backgroundDimens.width, animate)
|
||||||
|
|||||||
@@ -55,12 +55,12 @@ private const val PX_PER_MS = 1
|
|||||||
|
|
||||||
internal const val MIN_DURATION_ACTIVE_ANIMATION = 300L
|
internal const val MIN_DURATION_ACTIVE_ANIMATION = 300L
|
||||||
private const val MIN_DURATION_CANCELLED_ANIMATION = 200L
|
private const val MIN_DURATION_CANCELLED_ANIMATION = 200L
|
||||||
private const val MIN_DURATION_COMMITTED_ANIMATION = 200L
|
private const val MIN_DURATION_COMMITTED_ANIMATION = 120L
|
||||||
private const val MIN_DURATION_INACTIVE_BEFORE_FLUNG_ANIMATION = 50L
|
private const val MIN_DURATION_INACTIVE_BEFORE_FLUNG_ANIMATION = 50L
|
||||||
private const val MIN_DURATION_CONSIDERED_AS_FLING = 100L
|
private const val MIN_DURATION_CONSIDERED_AS_FLING = 100L
|
||||||
|
|
||||||
private const val FAILSAFE_DELAY_MS = 350L
|
private const val FAILSAFE_DELAY_MS = 350L
|
||||||
private const val POP_ON_FLING_DELAY = 160L
|
private const val POP_ON_FLING_DELAY = 140L
|
||||||
|
|
||||||
internal val VIBRATE_ACTIVATED_EFFECT =
|
internal val VIBRATE_ACTIVATED_EFFECT =
|
||||||
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK)
|
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK)
|
||||||
@@ -148,8 +148,6 @@ class BackPanelController internal constructor(
|
|||||||
private var gestureSinceActionDown = 0L
|
private var gestureSinceActionDown = 0L
|
||||||
private var gestureEntryTime = 0L
|
private var gestureEntryTime = 0L
|
||||||
private var gestureActiveTime = 0L
|
private var gestureActiveTime = 0L
|
||||||
private var gestureInactiveOrEntryTime = 0L
|
|
||||||
private var gestureArrowStrokeVisibleTime = 0L
|
|
||||||
|
|
||||||
private val elapsedTimeSinceActionDown
|
private val elapsedTimeSinceActionDown
|
||||||
get() = SystemClock.uptimeMillis() - gestureSinceActionDown
|
get() = SystemClock.uptimeMillis() - gestureSinceActionDown
|
||||||
@@ -441,34 +439,44 @@ class BackPanelController internal constructor(
|
|||||||
|
|
||||||
updateArrowStateOnMove(yTranslation, xTranslation)
|
updateArrowStateOnMove(yTranslation, xTranslation)
|
||||||
|
|
||||||
|
val gestureProgress = when (currentState) {
|
||||||
|
GestureState.ACTIVE -> fullScreenProgress(xTranslation)
|
||||||
|
GestureState.ENTRY -> staticThresholdProgress(xTranslation)
|
||||||
|
GestureState.INACTIVE -> reactivationThresholdProgress(totalTouchDelta)
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
gestureProgress?.let {
|
||||||
when (currentState) {
|
when (currentState) {
|
||||||
GestureState.ACTIVE -> {
|
GestureState.ACTIVE -> stretchActiveBackIndicator(gestureProgress)
|
||||||
stretchActiveBackIndicator(fullScreenProgress(xTranslation))
|
GestureState.ENTRY -> stretchEntryBackIndicator(gestureProgress)
|
||||||
}
|
GestureState.INACTIVE -> stretchInactiveBackIndicator(gestureProgress)
|
||||||
GestureState.ENTRY -> {
|
|
||||||
val progress = staticThresholdProgress(xTranslation)
|
|
||||||
stretchEntryBackIndicator(progress)
|
|
||||||
|
|
||||||
params.arrowStrokeAlphaSpring.get(progress).takeIf { it.isNewState }?.let {
|
|
||||||
mView.popArrowAlpha(0f, it.value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
GestureState.INACTIVE -> {
|
|
||||||
val progress = reactivationThresholdProgress(totalTouchDelta)
|
|
||||||
stretchInactiveBackIndicator(progress)
|
|
||||||
|
|
||||||
params.arrowStrokeAlphaSpring.get(progress).takeIf { it.isNewState }?.let {
|
|
||||||
gestureArrowStrokeVisibleTime = SystemClock.uptimeMillis()
|
|
||||||
mView.popArrowAlpha(0f, it.value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else -> {}
|
else -> {}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// set y translation
|
setArrowStrokeAlpha(gestureProgress)
|
||||||
setVerticalTranslation(yOffset)
|
setVerticalTranslation(yOffset)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun setArrowStrokeAlpha(gestureProgress: Float?) {
|
||||||
|
val strokeAlphaProgress = when (currentState) {
|
||||||
|
GestureState.ENTRY -> gestureProgress
|
||||||
|
GestureState.INACTIVE -> gestureProgress
|
||||||
|
GestureState.ACTIVE,
|
||||||
|
GestureState.FLUNG,
|
||||||
|
GestureState.COMMITTED -> 1f
|
||||||
|
GestureState.CANCELLED,
|
||||||
|
GestureState.GONE -> 0f
|
||||||
|
}
|
||||||
|
|
||||||
|
strokeAlphaProgress?.let { progress ->
|
||||||
|
params.arrowStrokeAlphaSpring.get(progress).takeIf { it.isNewState }?.let {
|
||||||
|
mView.popArrowAlpha(0f, it.value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun setVerticalTranslation(yOffset: Float) {
|
private fun setVerticalTranslation(yOffset: Float) {
|
||||||
val yTranslation = abs(yOffset)
|
val yTranslation = abs(yOffset)
|
||||||
val maxYOffset = (mView.height - params.entryIndicator.backgroundDimens.height) / 2f
|
val maxYOffset = (mView.height - params.entryIndicator.backgroundDimens.height) / 2f
|
||||||
@@ -599,7 +607,7 @@ class BackPanelController internal constructor(
|
|||||||
|
|
||||||
private fun isFlungAwayFromEdge(endX: Float, startX: Float = touchDeltaStartX): Boolean {
|
private fun isFlungAwayFromEdge(endX: Float, startX: Float = touchDeltaStartX): Boolean {
|
||||||
val minDistanceConsideredForFling = ViewConfiguration.get(context).scaledTouchSlop
|
val minDistanceConsideredForFling = ViewConfiguration.get(context).scaledTouchSlop
|
||||||
val flingDistance = abs(endX - startX)
|
val flingDistance = if (mView.isLeftPanel) endX - startX else startX - endX
|
||||||
val isPastFlingVelocity = isDragAwayFromEdge(
|
val isPastFlingVelocity = isDragAwayFromEdge(
|
||||||
velocityPxPerSecThreshold =
|
velocityPxPerSecThreshold =
|
||||||
ViewConfiguration.get(context).scaledMinimumFlingVelocity)
|
ViewConfiguration.get(context).scaledMinimumFlingVelocity)
|
||||||
@@ -764,7 +772,7 @@ class BackPanelController internal constructor(
|
|||||||
GestureState.ENTRY,
|
GestureState.ENTRY,
|
||||||
GestureState.INACTIVE -> params.entryIndicator.arrowDimens
|
GestureState.INACTIVE -> params.entryIndicator.arrowDimens
|
||||||
GestureState.ACTIVE -> params.activeIndicator.arrowDimens
|
GestureState.ACTIVE -> params.activeIndicator.arrowDimens
|
||||||
GestureState.FLUNG,
|
GestureState.FLUNG -> params.flungIndicator.arrowDimens
|
||||||
GestureState.COMMITTED -> params.committedIndicator.arrowDimens
|
GestureState.COMMITTED -> params.committedIndicator.arrowDimens
|
||||||
GestureState.CANCELLED -> params.cancelledIndicator.arrowDimens
|
GestureState.CANCELLED -> params.cancelledIndicator.arrowDimens
|
||||||
},
|
},
|
||||||
@@ -825,7 +833,6 @@ class BackPanelController internal constructor(
|
|||||||
|
|
||||||
updateRestingArrowDimens()
|
updateRestingArrowDimens()
|
||||||
gestureEntryTime = SystemClock.uptimeMillis()
|
gestureEntryTime = SystemClock.uptimeMillis()
|
||||||
gestureInactiveOrEntryTime = SystemClock.uptimeMillis()
|
|
||||||
}
|
}
|
||||||
GestureState.ACTIVE -> {
|
GestureState.ACTIVE -> {
|
||||||
previousXTranslationOnActiveOffset = previousXTranslation
|
previousXTranslationOnActiveOffset = previousXTranslation
|
||||||
@@ -857,7 +864,13 @@ class BackPanelController internal constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
GestureState.INACTIVE -> {
|
GestureState.INACTIVE -> {
|
||||||
gestureInactiveOrEntryTime = SystemClock.uptimeMillis()
|
|
||||||
|
// Typically entering INACTIVE means
|
||||||
|
// totalTouchDelta <= deactivationSwipeTriggerThreshold
|
||||||
|
// but because we can also independently enter this state
|
||||||
|
// if touch Y >> touch X, we force it to deactivationSwipeTriggerThreshold
|
||||||
|
// so that gesture progress in this state is consistent regardless of entry
|
||||||
|
totalTouchDelta = params.deactivationSwipeTriggerThreshold
|
||||||
|
|
||||||
val startingVelocity = convertVelocityToSpringStartingVelocity(
|
val startingVelocity = convertVelocityToSpringStartingVelocity(
|
||||||
valueOnFastVelocity = -1.05f,
|
valueOnFastVelocity = -1.05f,
|
||||||
|
|||||||
@@ -9,8 +9,8 @@ import com.android.systemui.R
|
|||||||
data class EdgePanelParams(private var resources: Resources) {
|
data class EdgePanelParams(private var resources: Resources) {
|
||||||
|
|
||||||
data class ArrowDimens(
|
data class ArrowDimens(
|
||||||
val length: Float = 0f,
|
val length: Float? = 0f,
|
||||||
val height: Float = 0f,
|
val height: Float? = 0f,
|
||||||
val alpha: Float = 0f,
|
val alpha: Float = 0f,
|
||||||
var alphaSpring: SpringForce? = null,
|
var alphaSpring: SpringForce? = null,
|
||||||
val heightSpring: SpringForce? = null,
|
val heightSpring: SpringForce? = null,
|
||||||
@@ -139,17 +139,17 @@ data class EdgePanelParams(private var resources: Resources) {
|
|||||||
|
|
||||||
entryWidthInterpolator = PathInterpolator(.19f, 1.27f, .71f, .86f)
|
entryWidthInterpolator = PathInterpolator(.19f, 1.27f, .71f, .86f)
|
||||||
entryWidthTowardsEdgeInterpolator = PathInterpolator(1f, -3f, 1f, 1.2f)
|
entryWidthTowardsEdgeInterpolator = PathInterpolator(1f, -3f, 1f, 1.2f)
|
||||||
activeWidthInterpolator = PathInterpolator(.15f, .48f, .46f, .89f)
|
activeWidthInterpolator = PathInterpolator(.32f, 0f, .16f, .94f)
|
||||||
arrowAngleInterpolator = entryWidthInterpolator
|
arrowAngleInterpolator = entryWidthInterpolator
|
||||||
translationInterpolator = PathInterpolator(0.2f, 1.0f, 1.0f, 1.0f)
|
translationInterpolator = PathInterpolator(0.2f, 1.0f, 1.0f, 1.0f)
|
||||||
farCornerInterpolator = PathInterpolator(.03f, .19f, .14f, 1.09f)
|
farCornerInterpolator = PathInterpolator(.03f, .19f, .14f, 1.09f)
|
||||||
edgeCornerInterpolator = PathInterpolator(0f, 1.11f, .85f, .84f)
|
edgeCornerInterpolator = PathInterpolator(0f, 1.11f, .85f, .84f)
|
||||||
heightInterpolator = PathInterpolator(1f, .05f, .9f, -0.29f)
|
heightInterpolator = PathInterpolator(1f, .05f, .9f, -0.29f)
|
||||||
|
|
||||||
val showArrowOnProgressValue = .2f
|
val showArrowOnProgressValue = .23f
|
||||||
val showArrowOnProgressValueFactor = 1.05f
|
val showArrowOnProgressValueFactor = 1.05f
|
||||||
|
|
||||||
val entryActiveHorizontalTranslationSpring = createSpring(675f, 0.8f)
|
val entryActiveHorizontalTranslationSpring = createSpring(800f, 0.8f)
|
||||||
val activeCommittedArrowLengthSpring = createSpring(1500f, 0.29f)
|
val activeCommittedArrowLengthSpring = createSpring(1500f, 0.29f)
|
||||||
val activeCommittedArrowHeightSpring = createSpring(1500f, 0.29f)
|
val activeCommittedArrowHeightSpring = createSpring(1500f, 0.29f)
|
||||||
val flungCommittedEdgeCornerSpring = createSpring(10000f, 1f)
|
val flungCommittedEdgeCornerSpring = createSpring(10000f, 1f)
|
||||||
@@ -178,7 +178,7 @@ data class EdgePanelParams(private var resources: Resources) {
|
|||||||
height = getDimen(R.dimen.navigation_edge_entry_background_height),
|
height = getDimen(R.dimen.navigation_edge_entry_background_height),
|
||||||
edgeCornerRadius = getDimen(R.dimen.navigation_edge_entry_edge_corners),
|
edgeCornerRadius = getDimen(R.dimen.navigation_edge_entry_edge_corners),
|
||||||
farCornerRadius = getDimen(R.dimen.navigation_edge_entry_far_corners),
|
farCornerRadius = getDimen(R.dimen.navigation_edge_entry_far_corners),
|
||||||
alphaSpring = createSpring(900f, 1f),
|
alphaSpring = createSpring(1100f, 1f),
|
||||||
widthSpring = createSpring(450f, 0.65f),
|
widthSpring = createSpring(450f, 0.65f),
|
||||||
heightSpring = createSpring(1500f, 0.45f),
|
heightSpring = createSpring(1500f, 0.45f),
|
||||||
farCornerRadiusSpring = createSpring(300f, 0.5f),
|
farCornerRadiusSpring = createSpring(300f, 0.5f),
|
||||||
@@ -232,7 +232,7 @@ data class EdgePanelParams(private var resources: Resources) {
|
|||||||
getDimen(R.dimen.navigation_edge_pre_threshold_edge_corners),
|
getDimen(R.dimen.navigation_edge_pre_threshold_edge_corners),
|
||||||
farCornerRadius =
|
farCornerRadius =
|
||||||
getDimen(R.dimen.navigation_edge_pre_threshold_far_corners),
|
getDimen(R.dimen.navigation_edge_pre_threshold_far_corners),
|
||||||
widthSpring = createSpring(200f, 0.65f),
|
widthSpring = createSpring(250f, 0.65f),
|
||||||
heightSpring = createSpring(1500f, 0.45f),
|
heightSpring = createSpring(1500f, 0.45f),
|
||||||
farCornerRadiusSpring = createSpring(200f, 1f),
|
farCornerRadiusSpring = createSpring(200f, 1f),
|
||||||
edgeCornerRadiusSpring = createSpring(150f, 0.5f),
|
edgeCornerRadiusSpring = createSpring(150f, 0.5f),
|
||||||
@@ -244,6 +244,8 @@ data class EdgePanelParams(private var resources: Resources) {
|
|||||||
arrowDimens = activeIndicator.arrowDimens.copy(
|
arrowDimens = activeIndicator.arrowDimens.copy(
|
||||||
lengthSpring = activeCommittedArrowLengthSpring,
|
lengthSpring = activeCommittedArrowLengthSpring,
|
||||||
heightSpring = activeCommittedArrowHeightSpring,
|
heightSpring = activeCommittedArrowHeightSpring,
|
||||||
|
length = null,
|
||||||
|
height = null,
|
||||||
),
|
),
|
||||||
backgroundDimens = activeIndicator.backgroundDimens.copy(
|
backgroundDimens = activeIndicator.backgroundDimens.copy(
|
||||||
alpha = 0f,
|
alpha = 0f,
|
||||||
@@ -255,13 +257,15 @@ data class EdgePanelParams(private var resources: Resources) {
|
|||||||
farCornerRadiusSpring = flungCommittedFarCornerSpring,
|
farCornerRadiusSpring = flungCommittedFarCornerSpring,
|
||||||
),
|
),
|
||||||
scale = 0.85f,
|
scale = 0.85f,
|
||||||
scaleSpring = createSpring(650f, 1f),
|
scaleSpring = createSpring(1150f, 1f),
|
||||||
)
|
)
|
||||||
|
|
||||||
flungIndicator = committedIndicator.copy(
|
flungIndicator = committedIndicator.copy(
|
||||||
arrowDimens = committedIndicator.arrowDimens.copy(
|
arrowDimens = committedIndicator.arrowDimens.copy(
|
||||||
lengthSpring = createSpring(850f, 0.46f),
|
lengthSpring = createSpring(850f, 0.46f),
|
||||||
heightSpring = createSpring(850f, 0.46f),
|
heightSpring = createSpring(850f, 0.46f),
|
||||||
|
length = activeIndicator.arrowDimens.length,
|
||||||
|
height = activeIndicator.arrowDimens.height
|
||||||
),
|
),
|
||||||
backgroundDimens = committedIndicator.backgroundDimens.copy(
|
backgroundDimens = committedIndicator.backgroundDimens.copy(
|
||||||
widthSpring = flungCommittedWidthSpring,
|
widthSpring = flungCommittedWidthSpring,
|
||||||
|
|||||||
Reference in New Issue
Block a user