diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java
index 54914e8b99..c1433160f1 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java
@@ -1,17 +1,19 @@
package org.thoughtcrime.securesms.groups.ui.creategroup;
+import android.animation.ValueAnimator;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Pair;
import android.view.MenuItem;
-import android.view.View;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import com.annimon.stream.Stream;
+import com.google.android.material.button.MaterialButton;
+import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.ContactSelectionActivity;
@@ -28,6 +30,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.Stopwatch;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
+import org.thoughtcrime.securesms.util.ViewUtil;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
import org.whispersystems.libsignal.util.guava.Optional;
@@ -43,7 +46,9 @@ public class CreateGroupActivity extends ContactSelectionActivity {
private static final short REQUEST_CODE_ADD_DETAILS = 17275;
- private View next;
+ private ExtendedFloatingActionButton next;
+ private ValueAnimator padStart;
+ private ValueAnimator padEnd;
public static Intent newIntent(@NonNull Context context) {
Intent intent = new Intent(context, CreateGroupActivity.class);
@@ -67,6 +72,7 @@ public class CreateGroupActivity extends ContactSelectionActivity {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
next = findViewById(R.id.next);
+ extendSkip();
next.setOnClickListener(v -> handleNextPressed());
}
@@ -96,7 +102,7 @@ public class CreateGroupActivity extends ContactSelectionActivity {
getToolbar().clear();
}
- enableNext();
+ shrinkSkip();
return true;
}
@@ -106,16 +112,40 @@ public class CreateGroupActivity extends ContactSelectionActivity {
if (contactsFragment.hasQueryFilter()) {
getToolbar().clear();
}
+
+ if (contactsFragment.getSelectedContactsCount() == 0) {
+ extendSkip();
+ }
}
- private void enableNext() {
- next.setEnabled(true);
- next.animate().alpha(1f);
+ private void extendSkip() {
+ next.setIconGravity(MaterialButton.ICON_GRAVITY_END);
+ next.extend();
+ animatePadding(24, 18);
}
- private void disableNext() {
- next.setEnabled(false);
- next.animate().alpha(0.5f);
+ private void shrinkSkip() {
+ next.setIconGravity(MaterialButton.ICON_GRAVITY_START);
+ next.shrink();
+ animatePadding(16, 16);
+ }
+
+ private void animatePadding(int startDp, int endDp) {
+ if (padStart != null) padStart.cancel();
+
+ padStart = ValueAnimator.ofInt(next.getPaddingStart(), ViewUtil.dpToPx(startDp)).setDuration(200);
+ padStart.addUpdateListener(animation -> {
+ ViewUtil.setPaddingStart(next, (Integer) animation.getAnimatedValue());
+ });
+ padStart.start();
+
+ if (padEnd != null) padEnd.cancel();
+
+ padEnd = ValueAnimator.ofInt(next.getPaddingEnd(), ViewUtil.dpToPx(endDp)).setDuration(200);
+ padEnd.addUpdateListener(animation -> {
+ ViewUtil.setPaddingEnd(next, (Integer) animation.getAnimatedValue());
+ });
+ padEnd.start();
}
private void handleNextPressed() {
diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
index ba63eaecfd..909bed7637 100644
--- a/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
+++ b/app/src/main/java/org/thoughtcrime/securesms/util/ViewUtil.java
@@ -247,6 +247,22 @@ public final class ViewUtil {
view.setPadding(padding, padding, padding, padding);
}
+ public static void setPaddingStart(@NonNull View view, int padding) {
+ if (view.getLayoutDirection() == View.LAYOUT_DIRECTION_LTR) {
+ view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
+ } else {
+ view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, view.getPaddingBottom());
+ }
+ }
+
+ public static void setPaddingEnd(@NonNull View view, int padding) {
+ if (view.getLayoutDirection() != View.LAYOUT_DIRECTION_LTR) {
+ view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(), view.getPaddingBottom());
+ } else {
+ view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding, view.getPaddingBottom());
+ }
+ }
+
public static boolean isPointInsideView(@NonNull View view, float x, float y) {
int[] location = new int[2];
diff --git a/app/src/main/res/layout/create_group_activity.xml b/app/src/main/res/layout/create_group_activity.xml
index f876e79e66..510900c5a4 100644
--- a/app/src/main/res/layout/create_group_activity.xml
+++ b/app/src/main/res/layout/create_group_activity.xml
@@ -27,16 +27,27 @@
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/toolbar" />
-
+ app:layout_constraintEnd_toEndOf="parent" />
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index eb8061e9b2..765ba4613e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -3035,6 +3035,9 @@
Search Countries
+
+ Skip
+