Allow setting local group names and avatars for MMS groups.

This commit is contained in:
Alan Evans
2020-11-23 16:03:09 -04:00
committed by Alex Hart
parent 43e3ef2bee
commit 0bda1d46a2
14 changed files with 147 additions and 54 deletions

View File

@@ -8,6 +8,7 @@ import androidx.annotation.WorkerThread;
import androidx.core.util.Consumer;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.groups.GroupChangeException;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.GroupManager;
@@ -22,14 +23,14 @@ import org.whispersystems.libsignal.util.guava.Optional;
import java.io.IOException;
class EditPushGroupProfileRepository implements EditProfileRepository {
class EditGroupProfileRepository implements EditProfileRepository {
private static final String TAG = Log.tag(EditPushGroupProfileRepository.class);
private static final String TAG = Log.tag(EditGroupProfileRepository.class);
private final Context context;
private final GroupId.Push groupId;
private final Context context;
private final GroupId groupId;
EditPushGroupProfileRepository(@NonNull Context context, @NonNull GroupId.Push groupId) {
EditGroupProfileRepository(@NonNull Context context, @NonNull GroupId groupId) {
this.context = context.getApplicationContext();
this.groupId = groupId;
}
@@ -64,7 +65,18 @@ class EditPushGroupProfileRepository implements EditProfileRepository {
@Override
public void getCurrentName(@NonNull Consumer<String> nameConsumer) {
SimpleTask.run(() -> Recipient.resolved(getRecipientId()).getName(context), nameConsumer::accept);
SimpleTask.run(() -> {
RecipientId recipientId = getRecipientId();
Recipient recipient = Recipient.resolved(recipientId);
return DatabaseFactory.getGroupDatabase(context)
.getGroup(recipientId)
.transform(groupRecord -> {
String title = groupRecord.getTitle();
return title == null ? "" : title;
})
.or(() -> recipient.getName(context));
}, nameConsumer::accept);
}
@Override

View File

@@ -44,7 +44,7 @@ public class EditProfileActivity extends BaseActivity implements EditProfileFrag
return intent;
}
public static @NonNull Intent getIntentForGroupProfile(@NonNull Context context, @NonNull GroupId.Push groupId) {
public static @NonNull Intent getIntentForGroupProfile(@NonNull Context context, @NonNull GroupId groupId) {
Intent intent = new Intent(context, EditProfileActivity.class);
intent.putExtra(EditProfileActivity.SHOW_TOOLBAR, true);
intent.putExtra(EditProfileActivity.GROUP_ID, groupId.toString());

View File

@@ -119,11 +119,10 @@ public class EditProfileFragment extends LoggingFragment {
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
final GroupId groupId = GroupId.parseNullableOrThrow(requireArguments().getString(GROUP_ID, null));
final GroupId.Push pushGroupId = groupId != null ? groupId.requirePush() : null;
GroupId groupId = GroupId.parseNullableOrThrow(requireArguments().getString(GROUP_ID, null));
initializeResources(view, pushGroupId != null);
initializeViewModel(requireArguments().getBoolean(EXCLUDE_SYSTEM, false), pushGroupId, savedInstanceState != null);
initializeResources(view, groupId);
initializeViewModel(requireArguments().getBoolean(EXCLUDE_SYSTEM, false), groupId, savedInstanceState != null);
initializeProfileAvatar();
initializeProfileName();
initializeUsername();
@@ -174,11 +173,11 @@ public class EditProfileFragment extends LoggingFragment {
}
}
private void initializeViewModel(boolean excludeSystem, @Nullable GroupId.Push groupId, boolean hasSavedInstanceState) {
private void initializeViewModel(boolean excludeSystem, @Nullable GroupId groupId, boolean hasSavedInstanceState) {
EditProfileRepository repository;
if (groupId != null) {
repository = new EditPushGroupProfileRepository(requireContext(), groupId);
repository = new EditGroupProfileRepository(requireContext(), groupId);
} else {
repository = new EditSelfProfileRepository(requireContext(), excludeSystem);
}
@@ -189,8 +188,9 @@ public class EditProfileFragment extends LoggingFragment {
.get(EditProfileViewModel.class);
}
private void initializeResources(@NonNull View view, boolean isEditingGroup) {
Bundle arguments = requireArguments();
private void initializeResources(@NonNull View view, @Nullable GroupId groupId) {
Bundle arguments = requireArguments();
boolean isEditingGroup = groupId != null;
this.toolbar = view.findViewById(R.id.toolbar);
this.title = view.findViewById(R.id.title);
@@ -213,10 +213,13 @@ public class EditProfileFragment extends LoggingFragment {
this.avatar.setOnClickListener(v -> startAvatarSelection());
this.givenName .addTextChangedListener(new AfterTextChanged(s -> {
trimInPlace(s, isEditingGroup);
viewModel.setGivenName(s.toString());
}));
this.givenName.addTextChangedListener(new AfterTextChanged(s -> {
trimInPlace(s, isEditingGroup);
viewModel.setGivenName(s.toString());
}));
view.findViewById(R.id.mms_group_hint)
.setVisibility(isEditingGroup && groupId.isMms() ? View.VISIBLE : View.GONE);
if (isEditingGroup) {
givenName.setHint(R.string.EditProfileFragment__group_name);

View File

@@ -1,6 +1,5 @@
package org.thoughtcrime.securesms.profiles.edit;
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.util.Consumer;
@@ -30,13 +29,15 @@ class EditProfileViewModel extends ViewModel {
private final MutableLiveData<byte[]> originalAvatar = new MutableLiveData<>();
private final MutableLiveData<Optional<String>> internalUsername = new MutableLiveData<>();
private final MutableLiveData<String> originalDisplayName = new MutableLiveData<>();
private final LiveData<Boolean> isFormValid = Transformations.map(trimmedGivenName, s -> s.length() > 0);
private final LiveData<Boolean> isFormValid;
private final EditProfileRepository repository;
private final GroupId groupId;
private EditProfileViewModel(@NonNull EditProfileRepository repository, boolean hasInstanceState, @Nullable GroupId groupId) {
this.repository = repository;
this.groupId = groupId;
this.repository = repository;
this.groupId = groupId;
this.isFormValid = groupId != null && groupId.isMms() ? LiveDataUtil.just(true)
: Transformations.map(trimmedGivenName, s -> s.length() > 0);
if (!hasInstanceState) {
if (groupId != null) {