From 5492685df294c0fd41c4ae0b119248a642fd76de Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Wed, 9 Jun 2021 11:14:37 -0400 Subject: [PATCH] Fix fragment lifecycle crash in Edit Profile. --- .../profiles/edit/EditProfileFragment.java | 15 ++++---- .../profiles/edit/EditProfileViewModel.java | 36 +++++++++++-------- .../edit/EditSelfProfileRepository.java | 3 ++ 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java index 2ba16161dd..8e43b9fd74 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileFragment.java @@ -38,7 +38,6 @@ import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.profiles.manage.EditProfileNameFragment; import org.thoughtcrime.securesms.providers.BlobProvider; -import org.thoughtcrime.securesms.registration.RegistrationUtil; import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; @@ -282,16 +281,20 @@ public class EditProfileFragment extends LoggingFragment { } private void handleUpload() { - viewModel.submitProfile(uploadResult -> { + viewModel.getUploadResult().observe(getViewLifecycleOwner(), uploadResult -> { if (uploadResult == EditProfileRepository.UploadResult.SUCCESS) { - RegistrationUtil.maybeMarkRegistrationComplete(requireContext()); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) handleFinishedLollipop(); - else handleFinishedLegacy(); + if (Build.VERSION.SDK_INT >= 21) { + handleFinishedLollipop(); + } + else { + handleFinishedLegacy(); + } } else { Toast.makeText(requireContext(), R.string.CreateProfileActivity_problem_setting_profile, Toast.LENGTH_LONG).show(); } }); + + viewModel.submitProfile(); } private void handleFinishedLegacy() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java index 3da8722036..e121272244 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java @@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.profiles.edit; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.util.Consumer; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import androidx.lifecycle.Transformations; @@ -11,6 +10,8 @@ import androidx.lifecycle.ViewModelProvider; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.profiles.ProfileName; +import org.thoughtcrime.securesms.profiles.edit.EditProfileRepository.UploadResult; +import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.StringUtil; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; @@ -19,18 +20,19 @@ import java.util.Objects; class EditProfileViewModel extends ViewModel { - private final MutableLiveData givenName = new MutableLiveData<>(); - private final MutableLiveData familyName = new MutableLiveData<>(); - private final LiveData trimmedGivenName = Transformations.map(givenName, StringUtil::trimToVisualBounds); - private final LiveData trimmedFamilyName = Transformations.map(familyName, StringUtil::trimToVisualBounds); - private final LiveData internalProfileName = LiveDataUtil.combineLatest(trimmedGivenName, trimmedFamilyName, ProfileName::fromParts); - private final MutableLiveData internalAvatar = new MutableLiveData<>(); - private final MutableLiveData originalAvatar = new MutableLiveData<>(); - private final MutableLiveData originalDisplayName = new MutableLiveData<>(); - private final LiveData isFormValid; - private final EditProfileRepository repository; - private final GroupId groupId; - private String originalDescription; + private final MutableLiveData givenName = new MutableLiveData<>(); + private final MutableLiveData familyName = new MutableLiveData<>(); + private final LiveData trimmedGivenName = Transformations.map(givenName, StringUtil::trimToVisualBounds); + private final LiveData trimmedFamilyName = Transformations.map(familyName, StringUtil::trimToVisualBounds); + private final LiveData internalProfileName = LiveDataUtil.combineLatest(trimmedGivenName, trimmedFamilyName, ProfileName::fromParts); + private final MutableLiveData internalAvatar = new MutableLiveData<>(); + private final MutableLiveData originalAvatar = new MutableLiveData<>(); + private final MutableLiveData originalDisplayName = new MutableLiveData<>(); + private final SingleLiveEvent uploadResult = new SingleLiveEvent<>(); + private final LiveData isFormValid; + private final EditProfileRepository repository; + private final GroupId groupId; + private String originalDescription; private EditProfileViewModel(@NonNull EditProfileRepository repository, boolean hasInstanceState, @Nullable GroupId groupId) { this.repository = repository; @@ -92,6 +94,10 @@ class EditProfileViewModel extends ViewModel { return hasAvatar(); } + public SingleLiveEvent getUploadResult() { + return uploadResult; + } + public void setGivenName(String givenName) { this.givenName.setValue(givenName); } @@ -104,7 +110,7 @@ class EditProfileViewModel extends ViewModel { internalAvatar.setValue(avatar); } - public void submitProfile(Consumer uploadResultConsumer) { + public void submitProfile() { ProfileName profileName = isGroup() ? ProfileName.EMPTY : internalProfileName.getValue(); String displayName = isGroup() ? givenName.getValue() : ""; String description = isGroup() ? familyName.getValue() : ""; @@ -125,7 +131,7 @@ class EditProfileViewModel extends ViewModel { !Objects.equals(StringUtil.stripBidiProtection(oldDescription), description), newAvatar, !Arrays.equals(oldAvatar, newAvatar), - uploadResultConsumer); + uploadResult::postValue); } static class Factory implements ViewModelProvider.Factory { diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java index f7bff8a3c8..f4eccdf5c4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditSelfProfileRepository.java @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.profiles.SystemProfileUtil; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; +import org.thoughtcrime.securesms.registration.RegistrationUtil; import org.thoughtcrime.securesms.util.concurrent.ListenableFuture; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import org.whispersystems.libsignal.util.guava.Optional; @@ -137,6 +138,8 @@ public class EditSelfProfileRepository implements EditProfileRepository { .then(Arrays.asList(new MultiDeviceProfileKeyUpdateJob(), new MultiDeviceProfileContentUpdateJob())) .enqueue(); + RegistrationUtil.maybeMarkRegistrationComplete(context); + return UploadResult.SUCCESS; }, uploadResultConsumer::accept); }