diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java index 72679d10e2..ae1b1fd5fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationActivity.java @@ -756,8 +756,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } else { menu.findItem(R.id.menu_distribution_conversation).setChecked(true); } + inflater.inflate(R.menu.conversation_active_group_options, menu); } 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) { 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); } - if (FeatureFlags.newGroupUI() && isPushGroupConversation()) { + if (FeatureFlags.newGroupUI()) { 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_conversation: handleDistributionConversationEnabled(item); 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_invite: handleInviteLink(); return true; case R.id.menu_mute_notifications: handleMuteNotifications(); return true; @@ -1041,8 +1042,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity } private void handleConversationSettings() { - if (FeatureFlags.newGroupUI() && isPushGroupConversation()) { - handleManagePushGroup(); + if (FeatureFlags.newGroupUI() && isGroupConversation()) { + handleManageGroup(); return; } @@ -1209,8 +1210,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity startActivityForResult(GroupCreateActivity.newEditGroupIntent(ConversationActivity.this, recipient.get().requireGroupId().requireV1()), GROUP_EDIT); } - private void handleManagePushGroup() { - startActivityForResult(ManageGroupActivity.newIntent(ConversationActivity.this, recipient.get().requireGroupId().requirePush()), + private void handleManageGroup() { + startActivityForResult(ManageGroupActivity.newIntent(ConversationActivity.this, recipient.get().requireGroupId()), GROUP_EDIT, ManageGroupActivity.createTransitionBundle(this, titleView.findViewById(R.id.contact_photo_image))); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java b/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java index c7385f0e17..f24ecaca0d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/LiveGroup.java @@ -2,6 +2,7 @@ package org.thoughtcrime.securesms.groups; import android.content.Context; import android.content.res.Resources; +import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.lifecycle.LiveData; @@ -52,7 +53,13 @@ public final class LiveGroup { } public LiveData 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 getGroupRecipient() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupActivity.java index 8815b525ca..4c8a20215d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupActivity.java @@ -22,7 +22,7 @@ public class ManageGroupActivity extends PassphraseRequiredActionBarActivity { 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.putExtra(GROUP_ID, groupId.toString()); return intent; diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java index 2b4edf99ce..e1de547b8f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupFragment.java @@ -79,8 +79,10 @@ public class ManageGroupFragment extends Fragment { private TextView editGroupAccessValue; private View editGroupMembershipRow; private TextView editGroupMembershipValue; + private View disappearingMessagesCard; private View disappearingMessagesRow; private TextView disappearingMessages; + private View blockAndLeaveCard; private TextView blockGroup; private TextView unblockGroup; private TextView leaveGroup; @@ -133,8 +135,10 @@ public class ManageGroupFragment extends Fragment { editGroupAccessValue = view.findViewById(R.id.edit_group_access_value); editGroupMembershipRow = view.findViewById(R.id.edit_group_membership_row); 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); disappearingMessages = view.findViewById(R.id.disappearing_messages); + blockAndLeaveCard = view.findViewById(R.id.group_block_and_leave_card); blockGroup = view.findViewById(R.id.blockGroup); unblockGroup = view.findViewById(R.id.unblockGroup); leaveGroup = view.findViewById(R.id.leaveGroup); @@ -154,9 +158,12 @@ public class ManageGroupFragment extends Fragment { super.onActivityCreated(savedInstanceState); Context context = requireContext(); - GroupId.Push groupId = getPushGroupId(); + GroupId groupId = getGroupId(); 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.getMembers().observe(getViewLifecycleOwner(), members -> groupMemberList.setMembers(members)); @@ -320,15 +327,15 @@ public class ManageGroupFragment extends Fragment { public boolean onMenuItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.action_edit) { - startActivity(EditProfileActivity.getIntentForGroupProfile(requireActivity(), getPushGroupId())); + startActivity(EditProfileActivity.getIntentForGroupProfile(requireActivity(), getGroupId().requirePush())); return true; } return false; } - private GroupId.Push getPushGroupId() { - return GroupId.parseOrThrow(Objects.requireNonNull(requireArguments().getString(GROUP_ID))).requirePush(); + private GroupId getGroupId() { + return GroupId.parseOrThrow(Objects.requireNonNull(requireArguments().getString(GROUP_ID))); } private void setMediaCursorFactory(@Nullable ManageGroupViewModel.CursorFactory cursorFactory) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupRepository.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupRepository.java index 28a64190cf..b66baac050 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupRepository.java @@ -7,10 +7,8 @@ import androidx.annotation.WorkerThread; import androidx.core.util.Consumer; import com.annimon.stream.Stream; -import com.google.protobuf.ByteString; import org.signal.storageservice.protos.groups.local.DecryptedGroup; -import org.signal.zkgroup.util.UUIDUtil; import org.thoughtcrime.securesms.ContactSelectionListFragment; import org.thoughtcrime.securesms.database.DatabaseFactory; 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.concurrent.SignalExecutors; import org.thoughtcrime.securesms.util.concurrent.SimpleTask; -import org.whispersystems.signalservice.api.groupsv2.GroupsV2Operations; import java.io.IOException; import java.util.LinkedList; import java.util.List; -import java.util.UUID; final class ManageGroupRepository { private static final String TAG = Log.tag(ManageGroupRepository.class); - private final Context context; - private final GroupId.Push groupId; + private final Context context; + private final GroupId groupId; - ManageGroupRepository(@NonNull Context context, @NonNull GroupId.Push groupId) { + ManageGroupRepository(@NonNull Context context, @NonNull GroupId groupId) { this.context = context; this.groupId = groupId; } @@ -149,7 +145,7 @@ final class ManageGroupRepository { void addMembers(@NonNull List selected, @NonNull AddMembersResultCallback addMembersResultCallback, @NonNull GroupChangeErrorCallback error) { SignalExecutors.UNBOUNDED.execute(() -> { try { - GroupManager.addMembers(context, groupId, selected); + GroupManager.addMembers(context, groupId.requirePush(), selected); addMembersResultCallback.onMembersAdded(selected.size()); } catch (GroupInsufficientRightsException | GroupNotAMemberException e) { Log.w(TAG, e); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java index fba25b44c4..af4725026a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/managegroup/ManageGroupViewModel.java @@ -333,10 +333,10 @@ public class ManageGroupViewModel extends ViewModel { } public static class Factory implements ViewModelProvider.Factory { - private final Context context; - private final GroupId.Push groupId; + private final Context context; + 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.groupId = groupId; } diff --git a/app/src/main/res/menu/conversation_push_group_v2_options.xml b/app/src/main/res/menu/conversation_active_group_options.xml similarity index 100% rename from app/src/main/res/menu/conversation_push_group_v2_options.xml rename to app/src/main/res/menu/conversation_active_group_options.xml