Use group manager for MMS groups.

This commit is contained in:
Alan Evans 2020-06-16 14:07:25 -03:00 committed by Greyson Parrelli
parent d467c04749
commit dfb5562142
7 changed files with 35 additions and 24 deletions

View file

@ -756,8 +756,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
} else { } else {
menu.findItem(R.id.menu_distribution_conversation).setChecked(true); menu.findItem(R.id.menu_distribution_conversation).setChecked(true);
} }
inflater.inflate(R.menu.conversation_active_group_options, menu);
} else if (isActiveV2Group || isActiveGroup && FeatureFlags.newGroupUI()) { } else if (isActiveV2Group || isActiveGroup && FeatureFlags.newGroupUI()) {
inflater.inflate(R.menu.conversation_push_group_v2_options, menu); inflater.inflate(R.menu.conversation_active_group_options, menu);
} else if (isActiveGroup) { } else if (isActiveGroup) {
inflater.inflate(R.menu.conversation_push_group_options, menu); inflater.inflate(R.menu.conversation_push_group_options, menu);
} }
@ -802,7 +803,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
hideMenuItem(menu, R.id.menu_mute_notifications); hideMenuItem(menu, R.id.menu_mute_notifications);
} }
if (FeatureFlags.newGroupUI() && isPushGroupConversation()) { if (FeatureFlags.newGroupUI()) {
hideMenuItem(menu, R.id.menu_group_recipients); hideMenuItem(menu, R.id.menu_group_recipients);
} }
@ -884,7 +885,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
case R.id.menu_distribution_broadcast: handleDistributionBroadcastEnabled(item); return true; case R.id.menu_distribution_broadcast: handleDistributionBroadcastEnabled(item); return true;
case R.id.menu_distribution_conversation: handleDistributionConversationEnabled(item); return true; case R.id.menu_distribution_conversation: handleDistributionConversationEnabled(item); return true;
case R.id.menu_edit_group: handleEditPushGroupV1(); return true; case R.id.menu_edit_group: handleEditPushGroupV1(); return true;
case R.id.menu_group_settings: handleManagePushGroup(); return true; case R.id.menu_group_settings: handleManageGroup(); return true;
case R.id.menu_leave: handleLeavePushGroup(); return true; case R.id.menu_leave: handleLeavePushGroup(); return true;
case R.id.menu_invite: handleInviteLink(); return true; case R.id.menu_invite: handleInviteLink(); return true;
case R.id.menu_mute_notifications: handleMuteNotifications(); return true; case R.id.menu_mute_notifications: handleMuteNotifications(); return true;
@ -1041,8 +1042,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
} }
private void handleConversationSettings() { private void handleConversationSettings() {
if (FeatureFlags.newGroupUI() && isPushGroupConversation()) { if (FeatureFlags.newGroupUI() && isGroupConversation()) {
handleManagePushGroup(); handleManageGroup();
return; return;
} }
@ -1209,8 +1210,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
startActivityForResult(GroupCreateActivity.newEditGroupIntent(ConversationActivity.this, recipient.get().requireGroupId().requireV1()), GROUP_EDIT); startActivityForResult(GroupCreateActivity.newEditGroupIntent(ConversationActivity.this, recipient.get().requireGroupId().requireV1()), GROUP_EDIT);
} }
private void handleManagePushGroup() { private void handleManageGroup() {
startActivityForResult(ManageGroupActivity.newIntent(ConversationActivity.this, recipient.get().requireGroupId().requirePush()), startActivityForResult(ManageGroupActivity.newIntent(ConversationActivity.this, recipient.get().requireGroupId()),
GROUP_EDIT, GROUP_EDIT,
ManageGroupActivity.createTransitionBundle(this, titleView.findViewById(R.id.contact_photo_image))); ManageGroupActivity.createTransitionBundle(this, titleView.findViewById(R.id.contact_photo_image)));
} }

View file

@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.groups;
import android.content.Context; import android.content.Context;
import android.content.res.Resources; import android.content.res.Resources;
import android.text.TextUtils;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.lifecycle.LiveData; import androidx.lifecycle.LiveData;
@ -52,7 +53,13 @@ public final class LiveGroup {
} }
public LiveData<String> getTitle() { public LiveData<String> getTitle() {
return Transformations.map(groupRecord, GroupDatabase.GroupRecord::getTitle); return LiveDataUtil.combineLatest(groupRecord, recipient, (groupRecord, recipient) -> {
String title = groupRecord.getTitle();
if (!TextUtils.isEmpty(title)) {
return title;
}
return recipient.getDisplayName(ApplicationDependencies.getApplication());
});
} }
public LiveData<Recipient> getGroupRecipient() { public LiveData<Recipient> getGroupRecipient() {

View file

@ -22,7 +22,7 @@ public class ManageGroupActivity extends PassphraseRequiredActionBarActivity {
private final DynamicTheme dynamicTheme = new DynamicNoActionBarTheme(); private final DynamicTheme dynamicTheme = new DynamicNoActionBarTheme();
public static Intent newIntent(@NonNull Context context, @NonNull GroupId.Push groupId) { public static Intent newIntent(@NonNull Context context, @NonNull GroupId groupId) {
Intent intent = new Intent(context, ManageGroupActivity.class); Intent intent = new Intent(context, ManageGroupActivity.class);
intent.putExtra(GROUP_ID, groupId.toString()); intent.putExtra(GROUP_ID, groupId.toString());
return intent; return intent;

View file

@ -79,8 +79,10 @@ public class ManageGroupFragment extends Fragment {
private TextView editGroupAccessValue; private TextView editGroupAccessValue;
private View editGroupMembershipRow; private View editGroupMembershipRow;
private TextView editGroupMembershipValue; private TextView editGroupMembershipValue;
private View disappearingMessagesCard;
private View disappearingMessagesRow; private View disappearingMessagesRow;
private TextView disappearingMessages; private TextView disappearingMessages;
private View blockAndLeaveCard;
private TextView blockGroup; private TextView blockGroup;
private TextView unblockGroup; private TextView unblockGroup;
private TextView leaveGroup; private TextView leaveGroup;
@ -133,8 +135,10 @@ public class ManageGroupFragment extends Fragment {
editGroupAccessValue = view.findViewById(R.id.edit_group_access_value); editGroupAccessValue = view.findViewById(R.id.edit_group_access_value);
editGroupMembershipRow = view.findViewById(R.id.edit_group_membership_row); editGroupMembershipRow = view.findViewById(R.id.edit_group_membership_row);
editGroupMembershipValue = view.findViewById(R.id.edit_group_membership_value); editGroupMembershipValue = view.findViewById(R.id.edit_group_membership_value);
disappearingMessagesCard = view.findViewById(R.id.group_disappearing_messages_card);
disappearingMessagesRow = view.findViewById(R.id.disappearing_messages_row); disappearingMessagesRow = view.findViewById(R.id.disappearing_messages_row);
disappearingMessages = view.findViewById(R.id.disappearing_messages); disappearingMessages = view.findViewById(R.id.disappearing_messages);
blockAndLeaveCard = view.findViewById(R.id.group_block_and_leave_card);
blockGroup = view.findViewById(R.id.blockGroup); blockGroup = view.findViewById(R.id.blockGroup);
unblockGroup = view.findViewById(R.id.unblockGroup); unblockGroup = view.findViewById(R.id.unblockGroup);
leaveGroup = view.findViewById(R.id.leaveGroup); leaveGroup = view.findViewById(R.id.leaveGroup);
@ -154,9 +158,12 @@ public class ManageGroupFragment extends Fragment {
super.onActivityCreated(savedInstanceState); super.onActivityCreated(savedInstanceState);
Context context = requireContext(); Context context = requireContext();
GroupId.Push groupId = getPushGroupId(); GroupId groupId = getGroupId();
ManageGroupViewModel.Factory factory = new ManageGroupViewModel.Factory(context, groupId); ManageGroupViewModel.Factory factory = new ManageGroupViewModel.Factory(context, groupId);
disappearingMessagesCard.setVisibility(groupId.isPush() ? View.VISIBLE : View.GONE);
blockAndLeaveCard.setVisibility(groupId.isPush() ? View.VISIBLE : View.GONE);
viewModel = ViewModelProviders.of(requireActivity(), factory).get(ManageGroupViewModel.class); viewModel = ViewModelProviders.of(requireActivity(), factory).get(ManageGroupViewModel.class);
viewModel.getMembers().observe(getViewLifecycleOwner(), members -> groupMemberList.setMembers(members)); viewModel.getMembers().observe(getViewLifecycleOwner(), members -> groupMemberList.setMembers(members));
@ -320,15 +327,15 @@ public class ManageGroupFragment extends Fragment {
public boolean onMenuItemSelected(@NonNull MenuItem item) { public boolean onMenuItemSelected(@NonNull MenuItem item) {
if (item.getItemId() == R.id.action_edit) { if (item.getItemId() == R.id.action_edit) {
startActivity(EditProfileActivity.getIntentForGroupProfile(requireActivity(), getPushGroupId())); startActivity(EditProfileActivity.getIntentForGroupProfile(requireActivity(), getGroupId().requirePush()));
return true; return true;
} }
return false; return false;
} }
private GroupId.Push getPushGroupId() { private GroupId getGroupId() {
return GroupId.parseOrThrow(Objects.requireNonNull(requireArguments().getString(GROUP_ID))).requirePush(); return GroupId.parseOrThrow(Objects.requireNonNull(requireArguments().getString(GROUP_ID)));
} }
private void setMediaCursorFactory(@Nullable ManageGroupViewModel.CursorFactory cursorFactory) { private void setMediaCursorFactory(@Nullable ManageGroupViewModel.CursorFactory cursorFactory) {

View file

@ -7,10 +7,8 @@ import androidx.annotation.WorkerThread;
import androidx.core.util.Consumer; import androidx.core.util.Consumer;
import com.annimon.stream.Stream; import com.annimon.stream.Stream;
import com.google.protobuf.ByteString;
import org.signal.storageservice.protos.groups.local.DecryptedGroup; import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.zkgroup.util.UUIDUtil;
import org.thoughtcrime.securesms.ContactSelectionListFragment; import org.thoughtcrime.securesms.ContactSelectionListFragment;
import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.GroupDatabase;
@ -33,21 +31,19 @@ import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.FeatureFlags;
import org.thoughtcrime.securesms.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.concurrent.SignalExecutors;
import org.thoughtcrime.securesms.util.concurrent.SimpleTask; import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations;
import java.io.IOException; import java.io.IOException;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.UUID;
final class ManageGroupRepository { final class ManageGroupRepository {
private static final String TAG = Log.tag(ManageGroupRepository.class); private static final String TAG = Log.tag(ManageGroupRepository.class);
private final Context context; private final Context context;
private final GroupId.Push groupId; private final GroupId groupId;
ManageGroupRepository(@NonNull Context context, @NonNull GroupId.Push groupId) { ManageGroupRepository(@NonNull Context context, @NonNull GroupId groupId) {
this.context = context; this.context = context;
this.groupId = groupId; this.groupId = groupId;
} }
@ -149,7 +145,7 @@ final class ManageGroupRepository {
void addMembers(@NonNull List<RecipientId> selected, @NonNull AddMembersResultCallback addMembersResultCallback, @NonNull GroupChangeErrorCallback error) { void addMembers(@NonNull List<RecipientId> selected, @NonNull AddMembersResultCallback addMembersResultCallback, @NonNull GroupChangeErrorCallback error) {
SignalExecutors.UNBOUNDED.execute(() -> { SignalExecutors.UNBOUNDED.execute(() -> {
try { try {
GroupManager.addMembers(context, groupId, selected); GroupManager.addMembers(context, groupId.requirePush(), selected);
addMembersResultCallback.onMembersAdded(selected.size()); addMembersResultCallback.onMembersAdded(selected.size());
} catch (GroupInsufficientRightsException | GroupNotAMemberException e) { } catch (GroupInsufficientRightsException | GroupNotAMemberException e) {
Log.w(TAG, e); Log.w(TAG, e);

View file

@ -333,10 +333,10 @@ public class ManageGroupViewModel extends ViewModel {
} }
public static class Factory implements ViewModelProvider.Factory { public static class Factory implements ViewModelProvider.Factory {
private final Context context; private final Context context;
private final GroupId.Push groupId; private final GroupId groupId;
public Factory(@NonNull Context context, @NonNull GroupId.Push groupId) { public Factory(@NonNull Context context, @NonNull GroupId groupId) {
this.context = context; this.context = context;
this.groupId = groupId; this.groupId = groupId;
} }