Fix fragment lifecycle crash in Edit Profile.

fork-5.53.8
Cody Henthorne 2021-06-09 11:14:37 -04:00 zatwierdzone przez Greyson Parrelli
rodzic ad8c6bc579
commit 5492685df2
3 zmienionych plików z 33 dodań i 21 usunięć

Wyświetl plik

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

Wyświetl plik

@ -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<String> givenName = new MutableLiveData<>();
private final MutableLiveData<String> familyName = new MutableLiveData<>();
private final LiveData<String> trimmedGivenName = Transformations.map(givenName, StringUtil::trimToVisualBounds);
private final LiveData<String> trimmedFamilyName = Transformations.map(familyName, StringUtil::trimToVisualBounds);
private final LiveData<ProfileName> internalProfileName = LiveDataUtil.combineLatest(trimmedGivenName, trimmedFamilyName, ProfileName::fromParts);
private final MutableLiveData<byte[]> internalAvatar = new MutableLiveData<>();
private final MutableLiveData<byte[]> originalAvatar = new MutableLiveData<>();
private final MutableLiveData<String> originalDisplayName = new MutableLiveData<>();
private final LiveData<Boolean> isFormValid;
private final EditProfileRepository repository;
private final GroupId groupId;
private String originalDescription;
private final MutableLiveData<String> givenName = new MutableLiveData<>();
private final MutableLiveData<String> familyName = new MutableLiveData<>();
private final LiveData<String> trimmedGivenName = Transformations.map(givenName, StringUtil::trimToVisualBounds);
private final LiveData<String> trimmedFamilyName = Transformations.map(familyName, StringUtil::trimToVisualBounds);
private final LiveData<ProfileName> internalProfileName = LiveDataUtil.combineLatest(trimmedGivenName, trimmedFamilyName, ProfileName::fromParts);
private final MutableLiveData<byte[]> internalAvatar = new MutableLiveData<>();
private final MutableLiveData<byte[]> originalAvatar = new MutableLiveData<>();
private final MutableLiveData<String> originalDisplayName = new MutableLiveData<>();
private final SingleLiveEvent<UploadResult> uploadResult = new SingleLiveEvent<>();
private final LiveData<Boolean> 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<UploadResult> 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<EditProfileRepository.UploadResult> 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 {

Wyświetl plik

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