Add more polish to Badges.

* Better network error handling
* Marking user cancellations so we don't annoy them
* Manage Profile screen treatment.
This commit is contained in:
Alex Hart
2021-10-29 14:05:22 -03:00
committed by Greyson Parrelli
parent 17517cfc88
commit 1af15842cc
19 changed files with 207 additions and 70 deletions

View File

@@ -27,6 +27,8 @@ import org.thoughtcrime.securesms.LoggingFragment;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.avatar.Avatars;
import org.thoughtcrime.securesms.avatar.picker.AvatarPickerFragment;
import org.thoughtcrime.securesms.badges.BadgeImageView;
import org.thoughtcrime.securesms.badges.models.Badge;
import org.thoughtcrime.securesms.components.emoji.EmojiUtil;
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.profiles.ProfileName;
@@ -34,6 +36,7 @@ import org.thoughtcrime.securesms.profiles.manage.ManageProfileViewModel.AvatarS
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.NameUtil;
import org.thoughtcrime.securesms.util.views.SimpleProgressDialog;
import org.whispersystems.libsignal.util.guava.Optional;
public class ManageProfileFragment extends LoggingFragment {
@@ -53,6 +56,7 @@ public class ManageProfileFragment extends LoggingFragment {
private TextView avatarInitials;
private ImageView avatarBackground;
private View badgesContainer;
private BadgeImageView badgeView;
private ManageProfileViewModel viewModel;
@@ -76,11 +80,14 @@ public class ManageProfileFragment extends LoggingFragment {
this.avatarInitials = view.findViewById(R.id.manage_profile_avatar_initials);
this.avatarBackground = view.findViewById(R.id.manage_profile_avatar_background);
this.badgesContainer = view.findViewById(R.id.manage_profile_badges_container);
this.badgeView = view.findViewById(R.id.manage_profile_badge);
initializeViewModel();
this.toolbar.setNavigationOnClickListener(v -> requireActivity().finish());
this.avatarView.setOnClickListener(v -> onAvatarClicked());
View editAvatar = view.findViewById(R.id.manage_profile_edit_photo);
editAvatar.setOnClickListener(v -> onEditAvatarClicked());
this.profileNameContainer.setOnClickListener(v -> {
Navigation.findNavController(v).navigate(ManageProfileFragmentDirections.actionManageProfileName());
@@ -126,6 +133,7 @@ public class ManageProfileFragment extends LoggingFragment {
viewModel.getEvents().observe(getViewLifecycleOwner(), this::presentEvent);
viewModel.getAbout().observe(getViewLifecycleOwner(), this::presentAbout);
viewModel.getAboutEmoji().observe(getViewLifecycleOwner(), this::presentAboutEmoji);
viewModel.getBadge().observe(getViewLifecycleOwner(), this::presentBadge);
if (viewModel.shouldShowUsername()) {
viewModel.getUsername().observe(getViewLifecycleOwner(), this::presentUsername);
@@ -217,6 +225,10 @@ public class ManageProfileFragment extends LoggingFragment {
}
}
private void presentBadge(@NonNull Optional<Badge> badge) {
badgeView.setBadge(badge.orNull());
}
private void presentEvent(@NonNull ManageProfileViewModel.Event event) {
switch (event) {
case AVATAR_DISK_FAILURE:
@@ -228,7 +240,7 @@ public class ManageProfileFragment extends LoggingFragment {
}
}
private void onAvatarClicked() {
private void onEditAvatarClicked() {
Navigation.findNavController(requireView()).navigate(ManageProfileFragmentDirections.actionManageProfileFragmentToAvatarPicker(null, null));
}
}

View File

@@ -12,6 +12,7 @@ import androidx.lifecycle.ViewModelProvider;
import org.signal.core.util.StreamUtil;
import org.signal.core.util.concurrent.SignalExecutors;
import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.badges.models.Badge;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobs.RetrieveProfileJob;
import org.thoughtcrime.securesms.mediasend.Media;
@@ -20,9 +21,11 @@ import org.thoughtcrime.securesms.profiles.ProfileName;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
import org.thoughtcrime.securesms.util.DefaultValueLiveData;
import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.SingleLiveEvent;
import org.thoughtcrime.securesms.util.livedata.LiveDataUtil;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.util.StreamDetails;
import java.io.IOException;
@@ -42,6 +45,7 @@ class ManageProfileViewModel extends ViewModel {
private final SingleLiveEvent<Event> events;
private final RecipientForeverObserver observer;
private final ManageProfileRepository repository;
private final MutableLiveData<Optional<Badge>> badge;
private byte[] previousAvatar;
@@ -53,6 +57,7 @@ class ManageProfileViewModel extends ViewModel {
this.aboutEmoji = new MutableLiveData<>();
this.events = new SingleLiveEvent<>();
this.repository = new ManageProfileRepository();
this.badge = new DefaultValueLiveData<>(Optional.absent());
this.observer = this::onRecipientChanged;
this.avatarState = LiveDataUtil.combineLatest(Recipient.self().live().getLiveData(), internalAvatarState, (self, state) -> new AvatarState(state, self));
@@ -97,6 +102,10 @@ class ManageProfileViewModel extends ViewModel {
return aboutEmoji;
}
public @NonNull LiveData<Optional<Badge>> getBadge() {
return badge;
}
public @NonNull LiveData<Event> getEvents() {
return events;
}
@@ -159,6 +168,7 @@ class ManageProfileViewModel extends ViewModel {
username.postValue(recipient.getUsername().orNull());
about.postValue(recipient.getAbout());
aboutEmoji.postValue(recipient.getAboutEmoji());
badge.postValue(Optional.fromNullable(recipient.getFeaturedBadge()));
}
@Override