Skip to content

Commit 3037a33

Browse files
alex-signalgreyson-signal
authored andcommitted
Add animation for swipe to archive.
1 parent ff633dd commit 3037a33

File tree

6 files changed

+55
-19
lines changed

6 files changed

+55
-19
lines changed

app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -50,26 +50,30 @@
5050
import androidx.annotation.PluralsRes;
5151
import androidx.annotation.WorkerThread;
5252
import androidx.appcompat.app.AppCompatActivity;
53+
import androidx.appcompat.content.res.AppCompatResources;
5354
import androidx.appcompat.view.ActionMode;
5455
import androidx.appcompat.widget.Toolbar;
5556
import androidx.appcompat.widget.TooltipCompat;
5657
import androidx.constraintlayout.widget.ConstraintLayout;
5758
import androidx.constraintlayout.widget.ConstraintSet;
58-
import androidx.core.content.res.ResourcesCompat;
59+
import androidx.core.view.ViewCompat;
5960
import androidx.fragment.app.DialogFragment;
6061
import androidx.lifecycle.ViewModelProviders;
6162
import androidx.recyclerview.widget.ItemTouchHelper;
6263
import androidx.recyclerview.widget.LinearLayoutManager;
6364
import androidx.recyclerview.widget.RecyclerView;
6465
import androidx.transition.TransitionManager;
6566

67+
import com.airbnb.lottie.SimpleColorFilter;
6668
import com.annimon.stream.Stream;
69+
import com.google.android.material.animation.ArgbEvaluatorCompat;
6770
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
6871
import com.google.android.material.snackbar.Snackbar;
6972

7073
import org.greenrobot.eventbus.EventBus;
7174
import org.greenrobot.eventbus.Subscribe;
7275
import org.greenrobot.eventbus.ThreadMode;
76+
import org.signal.core.util.DimensionUnit;
7377
import org.signal.core.util.concurrent.SignalExecutors;
7478
import org.signal.core.util.logging.Log;
7579
import org.thoughtcrime.securesms.MainFragment;
@@ -81,10 +85,10 @@
8185
import org.thoughtcrime.securesms.badges.self.expired.ExpiredBadgeBottomSheetDialogFragment;
8286
import org.thoughtcrime.securesms.components.RatingManager;
8387
import org.thoughtcrime.securesms.components.SearchToolbar;
88+
import org.thoughtcrime.securesms.components.UnreadPaymentsView;
8489
import org.thoughtcrime.securesms.components.menu.ActionItem;
8590
import org.thoughtcrime.securesms.components.menu.SignalBottomActionBar;
8691
import org.thoughtcrime.securesms.components.menu.SignalContextMenu;
87-
import org.thoughtcrime.securesms.components.UnreadPaymentsView;
8892
import org.thoughtcrime.securesms.components.recyclerview.DeleteItemAnimator;
8993
import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionButton;
9094
import org.thoughtcrime.securesms.components.reminder.DozeReminder;
@@ -1236,7 +1240,7 @@ protected Toolbar getToolbar(@NonNull View rootView) {
12361240
}
12371241

12381242
protected @DrawableRes int getArchiveIconRes() {
1239-
return R.drawable.ic_archive_white_36dp;
1243+
return R.drawable.ic_archive_24;
12401244
}
12411245

12421246
@WorkerThread
@@ -1332,6 +1336,9 @@ private void goToSinglePayment(@NonNull UUID paymentId) {
13321336

13331337
private class ArchiveListenerCallback extends ItemTouchHelper.SimpleCallback {
13341338

1339+
private static final int ARCHIVE_SWIPE_START_COLOR = 0xFF28782A;
1340+
private static final int ARCHIVE_SWIPE_END_COLOR = 0xFF329635;
1341+
13351342
ArchiveListenerCallback() {
13361343
super(0, ItemTouchHelper.RIGHT);
13371344
}
@@ -1376,35 +1383,61 @@ public void onChildDraw(@NonNull Canvas canvas, @NonNull RecyclerView recyclerVi
13761383
{
13771384
if (viewHolder.itemView instanceof ConversationListItemInboxZero) return;
13781385
if (actionState == ItemTouchHelper.ACTION_STATE_SWIPE) {
1379-
View itemView = viewHolder.itemView;
1380-
float alpha = 1.0f - Math.abs(dX) / (float) viewHolder.itemView.getWidth();
1386+
Resources resources = getResources();
1387+
View itemView = viewHolder.itemView;
1388+
float percentDx = Math.abs(dX) / viewHolder.itemView.getWidth();
1389+
int color = ArgbEvaluatorCompat.getInstance().evaluate(Math.min(1f, percentDx * (1 / 0.25f)), ARCHIVE_SWIPE_START_COLOR, ARCHIVE_SWIPE_END_COLOR);
1390+
float scaleStartPoint = DimensionUnit.DP.toPixels(48f);
1391+
float scaleEndPoint = DimensionUnit.DP.toPixels(112f);
1392+
1393+
float scale;
1394+
if (dX < scaleStartPoint) {
1395+
scale = 0.5f;
1396+
} else if (dX > scaleEndPoint) {
1397+
scale = 1f;
1398+
} else {
1399+
scale = Math.min(1f, 0.5f + ((dX - scaleStartPoint) / (scaleEndPoint - scaleStartPoint)) * (1f - 0.5f));
1400+
}
13811401

13821402
if (dX > 0) {
1383-
Resources resources = getResources();
1384-
13851403
if (archiveDrawable == null) {
1386-
archiveDrawable = ResourcesCompat.getDrawable(resources, getArchiveIconRes(), requireActivity().getTheme());
1387-
Objects.requireNonNull(archiveDrawable).setBounds(0, 0, archiveDrawable.getIntrinsicWidth(), archiveDrawable.getIntrinsicHeight());
1404+
archiveDrawable = Objects.requireNonNull(AppCompatResources.getDrawable(requireContext(), getArchiveIconRes()));
1405+
archiveDrawable.setColorFilter(new SimpleColorFilter(Color.WHITE));
1406+
archiveDrawable.setBounds(0, 0, archiveDrawable.getIntrinsicWidth(), archiveDrawable.getIntrinsicHeight());
13881407
}
13891408

13901409
canvas.save();
1391-
canvas.clipRect(itemView.getLeft(), itemView.getTop(), dX, itemView.getBottom());
1410+
canvas.clipRect(itemView.getLeft(), itemView.getTop(), itemView.getRight(), itemView.getBottom());
1411+
1412+
canvas.drawColor(color);
13921413

1393-
canvas.drawColor(alpha > 0 ? resources.getColor(R.color.green_500) : Color.WHITE);
1414+
float gutter = resources.getDimension(R.dimen.dsl_settings_gutter);
1415+
float extra = resources.getDimension(R.dimen.conversation_list_fragment_archive_padding);
13941416

1395-
canvas.translate(itemView.getLeft() + resources.getDimension(R.dimen.conversation_list_fragment_archive_padding),
1417+
canvas.translate(itemView.getLeft() + gutter + extra,
13961418
itemView.getTop() + (itemView.getBottom() - itemView.getTop() - archiveDrawable.getIntrinsicHeight()) / 2f);
13971419

1420+
canvas.scale(scale, scale, archiveDrawable.getIntrinsicWidth() / 2f, archiveDrawable.getIntrinsicHeight() / 2f);
1421+
13981422
archiveDrawable.draw(canvas);
13991423
canvas.restore();
1424+
1425+
ViewCompat.setElevation(viewHolder.itemView, DimensionUnit.DP.toPixels(4f));
1426+
} else if (dX == 0) {
1427+
ViewCompat.setElevation(viewHolder.itemView, DimensionUnit.DP.toPixels(0f));
14001428
}
14011429

1402-
viewHolder.itemView.setAlpha(alpha);
14031430
viewHolder.itemView.setTranslationX(dX);
14041431
} else {
14051432
super.onChildDraw(canvas, recyclerView, viewHolder, dX, dY, actionState, isCurrentlyActive);
14061433
}
14071434
}
1435+
1436+
@Override
1437+
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
1438+
super.clearView(recyclerView, viewHolder);
1439+
ViewCompat.setElevation(viewHolder.itemView, 0);
1440+
}
14081441
}
14091442

14101443
private class ScrollListener extends RecyclerView.OnScrollListener {

app/src/main/res/drawable-v21/conversation_list_item_background.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
</shape>
3434
</inset>
3535
</item>
36+
<item android:drawable="@drawable/conversation_list_item_background_default" />
3637
</ripple>
3738
</item>
3839
</selector>

app/src/main/res/drawable-v21/conversation_list_item_background_ripple.xml

Lines changed: 0 additions & 5 deletions
This file was deleted.

app/src/main/res/drawable/conversation_list_item_background.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
<item android:drawable="@color/core_ultramarine_33" android:state_selected="true" />
44
<item android:drawable="@color/core_ultramarine_33" android:state_pressed="true" />
55
<item android:drawable="@color/core_ultramarine_50" android:state_focused="true" />
6+
<item android:drawable="@drawable/conversation_list_item_background_default" />
67
</selector>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" >
3+
<solid android:color="@color/signal_background_primary"/>
4+
<corners android:radius="8dp"/>
5+
<padding android:bottom="5dp" android:left="5dp" android:right="5dp" android:top="5dp"/>
6+
</shape>

app/src/main/res/values/dimens.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@
105105

106106
<dimen name="tooltip_popup_margin">8dp</dimen>
107107

108-
<dimen name="conversation_list_fragment_archive_padding">16dp</dimen>
108+
<dimen name="conversation_list_fragment_archive_padding">12dp</dimen>
109109
<dimen name="contact_selection_actions_tap_area">10dp</dimen>
110110

111111
<dimen name="unread_count_bubble_radius">12.5dp</dimen>

0 commit comments

Comments
 (0)