Use group manager for MMS groups.
This commit is contained in:
parent
d467c04749
commit
dfb5562142
7 changed files with 35 additions and 24 deletions
|
@ -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)));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue