Update chat filter behaviour after round of feedback.

main
Alex Hart 2023-01-06 16:40:51 -04:00 zatwierdzone przez GitHub
rodzic 3869de414f
commit 383525e7b7
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
5 zmienionych plików z 35 dodań i 6 usunięć

Wyświetl plik

@ -292,10 +292,10 @@ public class ConversationListFragment extends MainFragment implements ActionMode
viewModel.setFiltered(false, source); viewModel.setFiltered(false, source);
break; break;
case OPENING: case OPENING:
ViewUtil.setMinimumHeight(collapsingToolbarLayout, openHeight);
viewModel.setFiltered(true, source); viewModel.setFiltered(true, source);
break; break;
case OPEN_APEX: case OPEN_APEX:
ViewUtil.setMinimumHeight(collapsingToolbarLayout, openHeight);
if (source == ConversationFilterSource.DRAG) { if (source == ConversationFilterSource.DRAG) {
SignalStore.uiHints().incrementNeverDisplayPullToFilterTip(); SignalStore.uiHints().incrementNeverDisplayPullToFilterTip();
} }
@ -1619,6 +1619,7 @@ public class ConversationListFragment extends MainFragment implements ActionMode
public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) { public int getSwipeDirs(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
if (viewHolder.itemView instanceof ConversationListItemAction || if (viewHolder.itemView instanceof ConversationListItemAction ||
viewHolder instanceof ConversationListAdapter.HeaderViewHolder || viewHolder instanceof ConversationListAdapter.HeaderViewHolder ||
viewHolder instanceof ClearFilterViewHolder ||
actionMode != null || actionMode != null ||
viewHolder.itemView.isSelected() || viewHolder.itemView.isSelected() ||
activeAdapter == searchAdapter) activeAdapter == searchAdapter)

Wyświetl plik

@ -43,6 +43,9 @@ class ConversationListFilterPullView @JvmOverloads constructor(
private const val ANIMATE_HELP_TEXT_VELOCITY_THRESHOLD = 1f private const val ANIMATE_HELP_TEXT_VELOCITY_THRESHOLD = 1f
private const val ANIMATE_HELP_TEXT_THRESHOLD = 30 private const val ANIMATE_HELP_TEXT_THRESHOLD = 30
private const val ANIMATE_HELP_TEXT_START_FRACTION = 0.35f private const val ANIMATE_HELP_TEXT_START_FRACTION = 0.35f
private const val CANCEL_THRESHOLD = 0.92f
private val COLOR_EVALUATOR = ArgbEvaluatorCompat.getInstance() private val COLOR_EVALUATOR = ArgbEvaluatorCompat.getInstance()
} }
@ -106,7 +109,7 @@ class ConversationListFilterPullView @JvmOverloads constructor(
if (state == FilterPullState.CLOSED && progress <= 0) { if (state == FilterPullState.CLOSED && progress <= 0) {
setState(FilterPullState.CLOSED, ConversationFilterSource.DRAG) setState(FilterPullState.CLOSED, ConversationFilterSource.DRAG)
} else if (state == FilterPullState.CLOSED && progress >= 1f) { } else if ((state == FilterPullState.CLOSED || state == FilterPullState.CANCELING) && progress >= 1f) {
setState(FilterPullState.OPEN_APEX, ConversationFilterSource.DRAG) setState(FilterPullState.OPEN_APEX, ConversationFilterSource.DRAG)
vibrate() vibrate()
resetHelpText() resetHelpText()
@ -115,6 +118,15 @@ class ConversationListFilterPullView @JvmOverloads constructor(
setState(FilterPullState.CLOSE_APEX, ConversationFilterSource.DRAG) setState(FilterPullState.CLOSE_APEX, ConversationFilterSource.DRAG)
vibrate() vibrate()
animatePillColor() animatePillColor()
} else if (state == FilterPullState.OPEN_APEX && progress <= CANCEL_THRESHOLD) {
setState(FilterPullState.CANCELING, ConversationFilterSource.DRAG)
vibrate()
}
if (state == FilterPullState.CANCELING) {
binding.filterCircle.alpha = FilterLerp.getCircleCancelAlphaLerp(progress)
} else {
binding.filterCircle.alpha = 1f
} }
if (state == FilterPullState.CLOSED && animateHelpText < ANIMATE_HELP_TEXT_THRESHOLD) { if (state == FilterPullState.CLOSED && animateHelpText < ANIMATE_HELP_TEXT_THRESHOLD) {
@ -151,7 +163,7 @@ class ConversationListFilterPullView @JvmOverloads constructor(
fun onUserDragFinished() { fun onUserDragFinished() {
if (state == FilterPullState.OPEN_APEX) { if (state == FilterPullState.OPEN_APEX) {
open(ConversationFilterSource.DRAG) open(ConversationFilterSource.DRAG)
} else if (state == FilterPullState.CLOSE_APEX) { } else if (state == FilterPullState.CLOSE_APEX || state == FilterPullState.CANCELING) {
close(ConversationFilterSource.DRAG) close(ConversationFilterSource.DRAG)
} }
} }
@ -257,7 +269,7 @@ class ConversationListFilterPullView @JvmOverloads constructor(
private fun FilterPullState.toLatestSettledState(): FilterPullState { private fun FilterPullState.toLatestSettledState(): FilterPullState {
return when (this) { return when (this) {
FilterPullState.CLOSED, FilterPullState.OPEN_APEX, FilterPullState.OPENING -> FilterPullState.CLOSED FilterPullState.CLOSED, FilterPullState.OPEN_APEX, FilterPullState.OPENING, FilterPullState.CANCELING -> FilterPullState.CLOSED
FilterPullState.OPEN, FilterPullState.CLOSE_APEX, FilterPullState.CLOSING -> FilterPullState.OPEN FilterPullState.OPEN, FilterPullState.CLOSE_APEX, FilterPullState.CLOSING -> FilterPullState.OPEN
} }
} }

Wyświetl plik

@ -175,13 +175,13 @@ class FilterCircleView @JvmOverloads constructor(
private fun evaluateBottomOffset(progress: Float, state: FilterPullState): Float { private fun evaluateBottomOffset(progress: Float, state: FilterPullState): Float {
return when (state) { return when (state) {
FilterPullState.OPEN_APEX, FilterPullState.OPENING, FilterPullState.OPEN, FilterPullState.CLOSE_APEX -> FilterLerp.getOpenCircleBottomPadLerp(progress) FilterPullState.OPENING, FilterPullState.OPEN, FilterPullState.CLOSE_APEX, FilterPullState.CANCELING, FilterPullState.OPEN_APEX -> FilterLerp.getOpenCircleBottomPadLerp(progress)
FilterPullState.CLOSED, FilterPullState.CLOSING -> FilterLerp.getClosedCircleBottomPadLerp(progress) FilterPullState.CLOSED, FilterPullState.CLOSING -> FilterLerp.getClosedCircleBottomPadLerp(progress)
} }
} }
private fun checkColorAnimators(state: FilterPullState) { private fun checkColorAnimators(state: FilterPullState) {
if (state != FilterPullState.CLOSED) { if (state != FilterPullState.CLOSED && state != FilterPullState.CANCELING) {
if (circleColorAnimator == null) { if (circleColorAnimator == null) {
circleColorAnimator = ValueAnimator circleColorAnimator = ValueAnimator
.ofInt(circleBackgroundColor, circleActiveBackgroundColor).apply { .ofInt(circleBackgroundColor, circleActiveBackgroundColor).apply {
@ -248,6 +248,7 @@ class FilterCircleView @JvmOverloads constructor(
val circleAlpha = when (state) { val circleAlpha = when (state) {
FilterPullState.CLOSED -> 255 FilterPullState.CLOSED -> 255
FilterPullState.OPEN_APEX -> 255 FilterPullState.OPEN_APEX -> 255
FilterPullState.CANCELING -> 255
FilterPullState.OPENING -> 255 FilterPullState.OPENING -> 255
FilterPullState.OPEN -> 0 FilterPullState.OPEN -> 0
FilterPullState.CLOSE_APEX -> 0 FilterPullState.CLOSE_APEX -> 0

Wyświetl plik

@ -43,6 +43,11 @@ object FilterLerp {
Point(0.7f * FILTER_APEX / 100, 1f) Point(0.7f * FILTER_APEX / 100, 1f)
) )
private val CIRCLE_CANCEL_ALPHA_LERP = getFn(
Point(0.61f, 1f),
Point(0.43f, 0f)
)
private fun helpTextAlphaLerp(@FloatRange(from = 0.0, to = 1.0) startFraction: Float) = getFn( private fun helpTextAlphaLerp(@FloatRange(from = 0.0, to = 1.0) startFraction: Float) = getFn(
Point(startFraction, 0f), Point(startFraction, 0f),
Point(1f, 1f) Point(1f, 1f)
@ -56,6 +61,10 @@ object FilterLerp {
return Util.clamp(getLerp(fraction, PILL_CLOSE_APEX_ALPHA_LERP), 0f, 1f) return Util.clamp(getLerp(fraction, PILL_CLOSE_APEX_ALPHA_LERP), 0f, 1f)
} }
fun getCircleCancelAlphaLerp(fraction: Float): Float {
return Util.clamp(getLerp(fraction, CIRCLE_CANCEL_ALPHA_LERP), 0f, 1f)
}
/** /**
* Get the LERP for the "Filter enabled" pill. * Get the LERP for the "Filter enabled" pill.
*/ */

Wyświetl plik

@ -16,6 +16,12 @@ enum class FilterPullState {
*/ */
OPEN_APEX, OPEN_APEX,
/**
* The filter has been dragged all the way to the apex, but the user started to drag back instead of
* releasing the filter.
*/
CANCELING,
/** /**
* The filter is being activated and the animation is running. * The filter is being activated and the animation is running.
*/ */