mirror of
https://github.com/oxen-io/session-android.git
synced 2025-08-26 02:58:08 +00:00
Animated skip button.
This commit is contained in:
@@ -1,17 +1,19 @@
|
|||||||
package org.thoughtcrime.securesms.groups.ui.creategroup;
|
package org.thoughtcrime.securesms.groups.ui.creategroup;
|
||||||
|
|
||||||
|
import android.animation.ValueAnimator;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.util.Pair;
|
import android.util.Pair;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
|
|
||||||
import com.annimon.stream.Stream;
|
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.signal.core.util.logging.Log;
|
||||||
import org.thoughtcrime.securesms.ContactSelectionActivity;
|
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.FeatureFlags;
|
||||||
import org.thoughtcrime.securesms.util.Stopwatch;
|
import org.thoughtcrime.securesms.util.Stopwatch;
|
||||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||||
|
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||||
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
|
import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
|
||||||
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
|
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
|
||||||
import org.whispersystems.libsignal.util.guava.Optional;
|
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 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) {
|
public static Intent newIntent(@NonNull Context context) {
|
||||||
Intent intent = new Intent(context, CreateGroupActivity.class);
|
Intent intent = new Intent(context, CreateGroupActivity.class);
|
||||||
@@ -67,6 +72,7 @@ public class CreateGroupActivity extends ContactSelectionActivity {
|
|||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
|
||||||
next = findViewById(R.id.next);
|
next = findViewById(R.id.next);
|
||||||
|
extendSkip();
|
||||||
|
|
||||||
next.setOnClickListener(v -> handleNextPressed());
|
next.setOnClickListener(v -> handleNextPressed());
|
||||||
}
|
}
|
||||||
@@ -96,7 +102,7 @@ public class CreateGroupActivity extends ContactSelectionActivity {
|
|||||||
getToolbar().clear();
|
getToolbar().clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
enableNext();
|
shrinkSkip();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -106,16 +112,40 @@ public class CreateGroupActivity extends ContactSelectionActivity {
|
|||||||
if (contactsFragment.hasQueryFilter()) {
|
if (contactsFragment.hasQueryFilter()) {
|
||||||
getToolbar().clear();
|
getToolbar().clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (contactsFragment.getSelectedContactsCount() == 0) {
|
||||||
|
extendSkip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enableNext() {
|
private void extendSkip() {
|
||||||
next.setEnabled(true);
|
next.setIconGravity(MaterialButton.ICON_GRAVITY_END);
|
||||||
next.animate().alpha(1f);
|
next.extend();
|
||||||
|
animatePadding(24, 18);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void disableNext() {
|
private void shrinkSkip() {
|
||||||
next.setEnabled(false);
|
next.setIconGravity(MaterialButton.ICON_GRAVITY_START);
|
||||||
next.animate().alpha(0.5f);
|
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() {
|
private void handleNextPressed() {
|
||||||
|
@@ -247,6 +247,22 @@ public final class ViewUtil {
|
|||||||
view.setPadding(padding, padding, padding, padding);
|
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) {
|
public static boolean isPointInsideView(@NonNull View view, float x, float y) {
|
||||||
int[] location = new int[2];
|
int[] location = new int[2];
|
||||||
|
|
||||||
|
@@ -27,16 +27,27 @@
|
|||||||
app:layout_constraintStart_toStartOf="parent"
|
app:layout_constraintStart_toStartOf="parent"
|
||||||
app:layout_constraintTop_toBottomOf="@id/toolbar" />
|
app:layout_constraintTop_toBottomOf="@id/toolbar" />
|
||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
|
||||||
android:id="@+id/next"
|
android:id="@+id/next"
|
||||||
android:layout_width="56dp"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="56dp"
|
android:layout_height="56dp"
|
||||||
android:layout_marginEnd="16dp"
|
android:layout_marginEnd="16dp"
|
||||||
android:layout_marginBottom="16dp"
|
android:layout_marginBottom="16dp"
|
||||||
|
android:inputType="textCapWords"
|
||||||
|
android:minWidth="0dp"
|
||||||
|
android:minHeight="56dp"
|
||||||
|
android:paddingStart="24dp"
|
||||||
|
android:paddingEnd="18dp"
|
||||||
|
android:text="@string/CreateGroupActivity__skip"
|
||||||
|
android:textColor="@color/core_white"
|
||||||
android:tint="@color/core_white"
|
android:tint="@color/core_white"
|
||||||
app:backgroundTint="@color/core_ultramarine"
|
app:backgroundTint="@color/core_ultramarine"
|
||||||
|
app:icon="@drawable/ic_arrow_end_24"
|
||||||
|
app:iconGravity="textEnd"
|
||||||
|
app:iconPadding="6dp"
|
||||||
|
app:iconSize="24dp"
|
||||||
|
app:iconTint="@color/core_white"
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
app:layout_constraintBottom_toBottomOf="parent"
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
app:layout_constraintEnd_toEndOf="parent" />
|
||||||
app:srcCompat="@drawable/ic_arrow_end_24" />
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
@@ -3035,6 +3035,9 @@
|
|||||||
<!-- DeleteAccountCountryPickerFragment -->
|
<!-- DeleteAccountCountryPickerFragment -->
|
||||||
<string name="DeleteAccountCountryPickerFragment__search_countries">Search Countries</string>
|
<string name="DeleteAccountCountryPickerFragment__search_countries">Search Countries</string>
|
||||||
|
|
||||||
|
<!-- CreateGroupActivity -->
|
||||||
|
<string name="CreateGroupActivity__skip">Skip</string>
|
||||||
|
|
||||||
<!-- EOF -->
|
<!-- EOF -->
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
Reference in New Issue
Block a user