mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-21 17:29:32 +01:00
Implement new Material3 spec.
This commit is contained in:
committed by
Greyson Parrelli
parent
556e480b06
commit
1b471e163d
@@ -13,7 +13,6 @@ import androidx.lifecycle.ViewModelProviders;
|
||||
|
||||
import com.annimon.stream.Collectors;
|
||||
import com.annimon.stream.Stream;
|
||||
import com.dd.CircularProgressButton;
|
||||
|
||||
import org.thoughtcrime.securesms.MainActivity;
|
||||
import org.thoughtcrime.securesms.PassphraseRequiredActivity;
|
||||
@@ -27,6 +26,7 @@ import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||
import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -34,10 +34,10 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
|
||||
|
||||
private static final String EXTRA_GROUP_ID = "group_id";
|
||||
|
||||
private ChooseNewAdminViewModel viewModel;
|
||||
private GroupMemberListView groupList;
|
||||
private CircularProgressButton done;
|
||||
private GroupId.V2 groupId;
|
||||
private ChooseNewAdminViewModel viewModel;
|
||||
private GroupMemberListView groupList;
|
||||
private CircularProgressMaterialButton done;
|
||||
private GroupId.V2 groupId;
|
||||
|
||||
private final DynamicTheme dynamicTheme = new DynamicNoActionBarTheme();
|
||||
|
||||
@@ -70,7 +70,6 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
|
||||
|
||||
groupList = findViewById(R.id.choose_new_admin_group_list);
|
||||
done = findViewById(R.id.choose_new_admin_done);
|
||||
done.setIndeterminateProgressMode(true);
|
||||
|
||||
initializeViewModel();
|
||||
|
||||
@@ -80,8 +79,7 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
|
||||
.collect(Collectors.toSet())));
|
||||
|
||||
done.setOnClickListener(v -> {
|
||||
done.setClickable(false);
|
||||
done.setProgress(50);
|
||||
done.setSpinning();
|
||||
viewModel.updateAdminsAndLeave(this::handleUpdateAndLeaveResult);
|
||||
});
|
||||
}
|
||||
@@ -116,8 +114,7 @@ public final class ChooseNewAdminActivity extends PassphraseRequiredActivity {
|
||||
startActivity(MainActivity.clearTop(this));
|
||||
finish();
|
||||
} else {
|
||||
done.setClickable(true);
|
||||
done.setProgress(0);
|
||||
done.cancelSpinning();
|
||||
//noinspection ConstantConditions
|
||||
Toast.makeText(this, GroupErrors.getUserDisplayMessage(updateResult.getFailureReason()), Toast.LENGTH_LONG).show();
|
||||
}
|
||||
|
||||
@@ -1,17 +1,18 @@
|
||||
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.view.MenuItem;
|
||||
import android.view.View;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.google.android.material.button.MaterialButton;
|
||||
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton;
|
||||
import com.google.android.material.floatingactionbutton.FloatingActionButton;
|
||||
|
||||
import org.signal.core.util.concurrent.SimpleTask;
|
||||
import org.signal.core.util.logging.Log;
|
||||
import org.thoughtcrime.securesms.ContactSelectionActivity;
|
||||
import org.thoughtcrime.securesms.ContactSelectionListFragment;
|
||||
@@ -25,8 +26,6 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.thoughtcrime.securesms.util.FeatureFlags;
|
||||
import org.thoughtcrime.securesms.util.Stopwatch;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.signal.core.util.concurrent.SimpleTask;
|
||||
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -42,9 +41,8 @@ public class CreateGroupActivity extends ContactSelectionActivity {
|
||||
|
||||
private static final short REQUEST_CODE_ADD_DETAILS = 17275;
|
||||
|
||||
private ExtendedFloatingActionButton next;
|
||||
private ValueAnimator padStart;
|
||||
private ValueAnimator padEnd;
|
||||
private MaterialButton skip;
|
||||
private FloatingActionButton next;
|
||||
|
||||
public static Intent newIntent(@NonNull Context context) {
|
||||
Intent intent = new Intent(context, CreateGroupActivity.class);
|
||||
@@ -67,9 +65,11 @@ public class CreateGroupActivity extends ContactSelectionActivity {
|
||||
assert getSupportActionBar() != null;
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
skip = findViewById(R.id.skip);
|
||||
next = findViewById(R.id.next);
|
||||
extendSkip();
|
||||
|
||||
skip.setOnClickListener(v -> handleNextPressed());
|
||||
next.setOnClickListener(v -> handleNextPressed());
|
||||
}
|
||||
|
||||
@@ -125,33 +125,13 @@ public class CreateGroupActivity extends ContactSelectionActivity {
|
||||
}
|
||||
|
||||
private void extendSkip() {
|
||||
next.setIconGravity(MaterialButton.ICON_GRAVITY_END);
|
||||
next.extend();
|
||||
animatePadding(24, 18);
|
||||
skip.setVisibility(View.VISIBLE);
|
||||
next.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
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();
|
||||
skip.setVisibility(View.GONE);
|
||||
next.setVisibility(View.VISIBLE);
|
||||
}
|
||||
|
||||
private void handleNextPressed() {
|
||||
|
||||
@@ -19,14 +19,15 @@ import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
import androidx.core.content.ContextCompat;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
import androidx.navigation.Navigation;
|
||||
import androidx.vectordrawable.graphics.drawable.VectorDrawableCompat;
|
||||
|
||||
import com.airbnb.lottie.SimpleColorFilter;
|
||||
import com.bumptech.glide.load.engine.DiskCacheStrategy;
|
||||
import com.bumptech.glide.request.target.CustomTarget;
|
||||
import com.bumptech.glide.request.transition.Transition;
|
||||
import com.dd.CircularProgressButton;
|
||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||
|
||||
import org.signal.core.util.EditTextUtil;
|
||||
@@ -49,7 +50,7 @@ import org.thoughtcrime.securesms.util.FeatureFlags;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.navigation.SafeNavigation;
|
||||
import org.thoughtcrime.securesms.util.text.AfterTextChanged;
|
||||
import org.thoughtcrime.securesms.util.views.LearnMoreTextView;
|
||||
import org.thoughtcrime.securesms.util.views.CircularProgressMaterialButton;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
@@ -60,13 +61,13 @@ public class AddGroupDetailsFragment extends LoggingFragment {
|
||||
private static final int AVATAR_PLACEHOLDER_INSET_DP = 18;
|
||||
private static final short REQUEST_DISAPPEARING_TIMER = 28621;
|
||||
|
||||
private CircularProgressButton create;
|
||||
private Callback callback;
|
||||
private AddGroupDetailsViewModel viewModel;
|
||||
private Drawable avatarPlaceholder;
|
||||
private EditText name;
|
||||
private Toolbar toolbar;
|
||||
private View disappearingMessagesRow;
|
||||
private CircularProgressMaterialButton create;
|
||||
private Callback callback;
|
||||
private AddGroupDetailsViewModel viewModel;
|
||||
private Drawable avatarPlaceholder;
|
||||
private EditText name;
|
||||
private Toolbar toolbar;
|
||||
private View disappearingMessagesRow;
|
||||
|
||||
@Override
|
||||
public void onAttach(@NonNull Context context) {
|
||||
@@ -94,17 +95,17 @@ public class AddGroupDetailsFragment extends LoggingFragment {
|
||||
toolbar = view.findViewById(R.id.toolbar);
|
||||
disappearingMessagesRow = view.findViewById(R.id.group_disappearing_messages_row);
|
||||
|
||||
setCreateEnabled(false, false);
|
||||
setCreateEnabled(false);
|
||||
|
||||
GroupMemberListView members = view.findViewById(R.id.member_list);
|
||||
ImageView avatar = view.findViewById(R.id.group_avatar);
|
||||
View mmsWarning = view.findViewById(R.id.mms_warning);
|
||||
LearnMoreTextView gv2Warning = view.findViewById(R.id.gv2_warning);
|
||||
View addLater = view.findViewById(R.id.add_later);
|
||||
TextView disappearingMessageValue = view.findViewById(R.id.group_disappearing_messages_value);
|
||||
|
||||
members.initializeAdapter(getViewLifecycleOwner());
|
||||
avatarPlaceholder = VectorDrawableCompat.create(getResources(), R.drawable.ic_camera_outline_32_ultramarine, requireActivity().getTheme());
|
||||
avatarPlaceholder = Objects.requireNonNull(VectorDrawableCompat.create(getResources(), R.drawable.ic_camera_outline_24, requireActivity().getTheme()));
|
||||
avatarPlaceholder.setColorFilter(new SimpleColorFilter(ContextCompat.getColor(requireContext(), R.color.signal_icon_tint_primary)));
|
||||
|
||||
if (savedInstanceState == null) {
|
||||
avatar.setImageDrawable(new InsetDrawable(avatarPlaceholder, ViewUtil.dpToPx(AVATAR_PLACEHOLDER_INSET_DP)));
|
||||
@@ -122,7 +123,7 @@ public class AddGroupDetailsFragment extends LoggingFragment {
|
||||
addLater.setVisibility(list.isEmpty() ? View.VISIBLE : View.GONE);
|
||||
members.setMembers(list);
|
||||
});
|
||||
viewModel.getCanSubmitForm().observe(getViewLifecycleOwner(), isFormValid -> setCreateEnabled(isFormValid, true));
|
||||
viewModel.getCanSubmitForm().observe(getViewLifecycleOwner(), this::setCreateEnabled);
|
||||
viewModel.getIsMms().observe(getViewLifecycleOwner(), isMms -> {
|
||||
disappearingMessagesRow.setVisibility(isMms ? View.GONE : View.VISIBLE);
|
||||
mmsWarning.setVisibility(isMms ? View.VISIBLE : View.GONE);
|
||||
@@ -205,9 +206,11 @@ public class AddGroupDetailsFragment extends LoggingFragment {
|
||||
}
|
||||
|
||||
private void handleCreateClicked() {
|
||||
create.setClickable(false);
|
||||
create.setIndeterminateProgressMode(true);
|
||||
create.setProgress(50);
|
||||
if (!create.isClickable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
create.setSpinning();
|
||||
|
||||
viewModel.create();
|
||||
}
|
||||
@@ -254,15 +257,12 @@ public class AddGroupDetailsFragment extends LoggingFragment {
|
||||
.show();
|
||||
}
|
||||
|
||||
private void setCreateEnabled(boolean isEnabled, boolean animate) {
|
||||
if (create.isEnabled() == isEnabled) {
|
||||
private void setCreateEnabled(boolean isEnabled) {
|
||||
if (create.isClickable() == isEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
create.setEnabled(isEnabled);
|
||||
create.animate()
|
||||
.setDuration(animate ? 300 : 0)
|
||||
.alpha(isEnabled ? 1f : 0.5f);
|
||||
create.setClickable(isEnabled);
|
||||
}
|
||||
|
||||
private void showAvatarPicker() {
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.widget.Toast;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.widget.SwitchCompat;
|
||||
import androidx.constraintlayout.widget.Group;
|
||||
import androidx.fragment.app.DialogFragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.lifecycle.ViewModelProviders;
|
||||
@@ -35,8 +36,8 @@ public final class GroupLinkInviteFriendsBottomSheetDialogFragment extends Botto
|
||||
|
||||
private Button groupLinkEnableAndShareButton;
|
||||
private Button groupLinkShareButton;
|
||||
private View memberApprovalRow;
|
||||
private View memberApprovalRow2;
|
||||
private Group controlGroup;
|
||||
private View controlOutline;
|
||||
private SwitchCompat memberApprovalSwitch;
|
||||
|
||||
private SimpleProgressDialog.DismissibleDialog busyDialog;
|
||||
@@ -68,8 +69,8 @@ public final class GroupLinkInviteFriendsBottomSheetDialogFragment extends Botto
|
||||
|
||||
groupLinkEnableAndShareButton = view.findViewById(R.id.group_link_enable_and_share_button);
|
||||
groupLinkShareButton = view.findViewById(R.id.group_link_share_button);
|
||||
memberApprovalRow = view.findViewById(R.id.group_link_enable_and_share_approve_new_members_row);
|
||||
memberApprovalRow2 = view.findViewById(R.id.group_link_enable_and_share_approve_new_members_row2);
|
||||
controlGroup = view.findViewById(R.id.control_group);
|
||||
controlOutline = view.findViewById(R.id.group_link_enable_and_share_approve_outline);
|
||||
memberApprovalSwitch = view.findViewById(R.id.group_link_enable_and_share_approve_new_members_switch);
|
||||
|
||||
view.findViewById(R.id.group_link_enable_and_share_cancel_button).setOnClickListener(v -> dismiss());
|
||||
@@ -91,20 +92,17 @@ public final class GroupLinkInviteFriendsBottomSheetDialogFragment extends Botto
|
||||
if (groupLinkUrlAndStatus.isEnabled()) {
|
||||
groupLinkShareButton.setVisibility(View.VISIBLE);
|
||||
groupLinkEnableAndShareButton.setVisibility(View.INVISIBLE);
|
||||
memberApprovalRow.setVisibility(View.GONE);
|
||||
memberApprovalRow2.setVisibility(View.GONE);
|
||||
|
||||
controlGroup.setVisibility(View.GONE);
|
||||
groupLinkShareButton.setOnClickListener(v -> shareGroupLinkAndDismiss(groupId));
|
||||
} else {
|
||||
memberApprovalRow.setVisibility(View.VISIBLE);
|
||||
memberApprovalRow2.setVisibility(View.VISIBLE);
|
||||
controlGroup.setVisibility(View.VISIBLE);
|
||||
|
||||
groupLinkEnableAndShareButton.setVisibility(View.VISIBLE);
|
||||
groupLinkShareButton.setVisibility(View.INVISIBLE);
|
||||
}
|
||||
});
|
||||
|
||||
memberApprovalRow.setOnClickListener(v -> viewModel.toggleMemberApproval());
|
||||
controlOutline.setOnClickListener(v -> viewModel.toggleMemberApproval());
|
||||
|
||||
viewModel.getMemberApproval()
|
||||
.observe(getViewLifecycleOwner(), enabled -> memberApprovalSwitch.setChecked(enabled));
|
||||
|
||||
Reference in New Issue
Block a user