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 +