Implement new Material3 spec.

This commit is contained in:
Alex Hart
2022-05-26 17:32:52 -03:00
committed by Greyson Parrelli
parent 556e480b06
commit 1b471e163d
374 changed files with 3219 additions and 3049 deletions

View File

@@ -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();
}

View File

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

View File

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

View File

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