Skip to content

Commit bec0353

Browse files
alex-signalalan-signal
authored andcommitted
Animated skip button.
1 parent 565eab9 commit bec0353

4 files changed

Lines changed: 73 additions & 13 deletions

File tree

app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,19 @@
11
package org.thoughtcrime.securesms.groups.ui.creategroup;
22

3+
import android.animation.ValueAnimator;
34
import android.content.Context;
45
import android.content.Intent;
56
import android.os.Bundle;
67
import android.util.Pair;
78
import android.view.MenuItem;
8-
import android.view.View;
99

1010
import androidx.annotation.NonNull;
1111
import androidx.annotation.Nullable;
1212
import androidx.appcompat.app.AlertDialog;
1313

1414
import com.annimon.stream.Stream;
15+
import com.google.android.material.button.MaterialButton;
16+
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
1517

1618
import org.signal.core.util.logging.Log;
1719
import org.thoughtcrime.securesms.ContactSelectionActivity;
@@ -28,6 +30,7 @@
2830
import org.thoughtcrime.securesms.util.FeatureFlags;
2931
import org.thoughtcrime.securesms.util.Stopwatch;
3032
import org.thoughtcrime.securesms.util.TextSecurePreferences;
33+
import org.thoughtcrime.securesms.util.ViewUtil;
3134
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
3235
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
3336
import org.whispersystems.libsignal.util.guava.Optional;
@@ -43,7 +46,9 @@ public class CreateGroupActivity extends ContactSelectionActivity {
4346

4447
private static final short REQUEST_CODE_ADD_DETAILS = 17275;
4548

46-
private View next;
49+
private ExtendedFloatingActionButton next;
50+
private ValueAnimator padStart;
51+
private ValueAnimator padEnd;
4752

4853
public static Intent newIntent(@NonNull Context context) {
4954
Intent intent = new Intent(context, CreateGroupActivity.class);
@@ -67,6 +72,7 @@ public void onCreate(Bundle bundle, boolean ready) {
6772
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
6873

6974
next = findViewById(R.id.next);
75+
extendSkip();
7076

7177
next.setOnClickListener(v -> handleNextPressed());
7278
}
@@ -96,7 +102,7 @@ public boolean onBeforeContactSelected(Optional<RecipientId> recipientId, String
96102
getToolbar().clear();
97103
}
98104

99-
enableNext();
105+
shrinkSkip();
100106

101107
return true;
102108
}
@@ -106,16 +112,40 @@ public void onContactDeselected(Optional<RecipientId> recipientId, String number
106112
if (contactsFragment.hasQueryFilter()) {
107113
getToolbar().clear();
108114
}
115+
116+
if (contactsFragment.getSelectedContactsCount() == 0) {
117+
extendSkip();
118+
}
109119
}
110120

111-
private void enableNext() {
112-
next.setEnabled(true);
113-
next.animate().alpha(1f);
121+
private void extendSkip() {
122+
next.setIconGravity(MaterialButton.ICON_GRAVITY_END);
123+
next.extend();
124+
animatePadding(24, 18);
114125
}
115126

116-
private void disableNext() {
117-
next.setEnabled(false);
118-
next.animate().alpha(0.5f);
127+
private void shrinkSkip() {
128+
next.setIconGravity(MaterialButton.ICON_GRAVITY_START);
129+
next.shrink();
130+
animatePadding(16, 16);
131+
}
132+
133+
private void animatePadding(int startDp, int endDp) {
134+
if (padStart != null) padStart.cancel();
135+
136+
padStart = ValueAnimator.ofInt(next.getPaddingStart(), ViewUtil.dpToPx(startDp)).setDuration(200);
137+
padStart.addUpdateListener(animation -> {
138+
ViewUtil.setPaddingStart(next, (Integer) animation.getAnimatedValue());
139+
});
140+
padStart.start();
141+
142+
if (padEnd != null) padEnd.cancel();
143+
144+
padEnd = ValueAnimator.ofInt(next.getPaddingEnd(), ViewUtil.dpToPx(endDp)).setDuration(200);
145+
padEnd.addUpdateListener(animation -> {
146+
ViewUtil.setPaddingEnd(next, (Integer) animation.getAnimatedValue());
147+
});
148+
padEnd.start();
119149
}
120150

121151
private void handleNextPressed() {

app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,22 @@ public static void setPadding(@NonNull View view, int padding) {
247247
view.setPadding(padding, padding, padding, padding);
248248
}
249249

250+
public static void setPaddingStart(@NonNull View view, int padding) {
251+
if (view.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR) {
252+
view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
253+
} else {
254+
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, view.getPaddingBottom());
255+
}
256+
}
257+
258+
public static void setPaddingEnd(@NonNull View view, int padding) {
259+
if (view.getLayoutDirection() != View.LAYOUT_DIRECTION_LTR) {
260+
view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
261+
} else {
262+
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, view.getPaddingBottom());
263+
}
264+
}
265+
250266
public static boolean isPointInsideView(@NonNull View view, float x, float y) {
251267
int[] location = new int[2];
252268

app/src/main/res/layout/create_group_activity.xml

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,27 @@
2727
app:layout_constraintStart_toStartOf="parent"
2828
app:layout_constraintTop_toBottomOf="@id/toolbar" />
2929

30-
<com.google.android.material.floatingactionbutton.FloatingActionButton
30+
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
3131
android:id="@+id/next"
32-
android:layout_width="56dp"
32+
android:layout_width="wrap_content"
3333
android:layout_height="56dp"
3434
android:layout_marginEnd="16dp"
3535
android:layout_marginBottom="16dp"
36+
android:inputType="textCapWords"
37+
android:minWidth="0dp"
38+
android:minHeight="56dp"
39+
android:paddingStart="24dp"
40+
android:paddingEnd="18dp"
41+
android:text="@string/CreateGroupActivity__skip"
42+
android:textColor="@color/core_white"
3643
android:tint="@color/core_white"
3744
app:backgroundTint="@color/core_ultramarine"
45+
app:icon="@drawable/ic_arrow_end_24"
46+
app:iconGravity="textEnd"
47+
app:iconPadding="6dp"
48+
app:iconSize="24dp"
49+
app:iconTint="@color/core_white"
3850
app:layout_constraintBottom_toBottomOf="parent"
39-
app:layout_constraintEnd_toEndOf="parent"
40-
app:srcCompat="@drawable/ic_arrow_end_24" />
51+
app:layout_constraintEnd_toEndOf="parent" />
4152

4253
</androidx.constraintlayout.widget.ConstraintLayout>

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3035,6 +3035,9 @@
30353035
<!-- DeleteAccountCountryPickerFragment -->
30363036
<string name="DeleteAccountCountryPickerFragment__search_countries">Search Countries</string>
30373037

3038+
<!-- CreateGroupActivity -->
3039+
<string name="CreateGroupActivity__skip">Skip</string>
3040+
30383041
<!-- EOF -->
30393042

30403043
</resources>

0 commit comments

Comments
 (0)