Animated skip button.

This commit is contained in:
Alex Hart
2021-01-08 20:50:30 -04:00
committed by Alan Evans
parent 565eab9dc1
commit bec03534ef
4 changed files with 73 additions and 13 deletions

View File

@@ -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() {

View File

@@ -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];