Search in sources :

Example 16 with GroupId

use of org.thoughtcrime.securesms.groups.GroupId in project Signal-Android by WhisperSystems.

the class RecipientBottomSheetDialogFragment method onViewCreated.

@Override
public void onViewCreated(@NonNull View fragmentView, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(fragmentView, savedInstanceState);
    Bundle arguments = requireArguments();
    RecipientId recipientId = RecipientId.from(Objects.requireNonNull(arguments.getString(ARGS_RECIPIENT_ID)));
    GroupId groupId = GroupId.parseNullableOrThrow(arguments.getString(ARGS_GROUP_ID));
    RecipientDialogViewModel.Factory factory = new RecipientDialogViewModel.Factory(requireContext().getApplicationContext(), recipientId, groupId);
    viewModel = ViewModelProviders.of(this, factory).get(RecipientDialogViewModel.class);
    viewModel.getRecipient().observe(getViewLifecycleOwner(), recipient -> {
        interactionsContainer.setVisibility(recipient.isSelf() ? View.GONE : View.VISIBLE);
        avatar.setFallbackPhotoProvider(new Recipient.FallbackPhotoProvider() {

            @Override
            @NonNull
            public FallbackContactPhoto getPhotoForLocalNumber() {
                return new FallbackPhoto80dp(R.drawable.ic_note_80, recipient.getAvatarColor());
            }
        });
        avatar.setAvatar(recipient);
        if (!recipient.isSelf()) {
            badgeImageView.setBadgeFromRecipient(recipient);
        }
        if (recipient.isSelf()) {
            avatar.setOnClickListener(v -> {
                dismiss();
                viewModel.onMessageClicked(requireActivity());
            });
        }
        String name = recipient.isSelf() ? requireContext().getString(R.string.note_to_self) : recipient.getDisplayName(requireContext());
        fullName.setVisibility(TextUtils.isEmpty(name) ? View.GONE : View.VISIBLE);
        SpannableStringBuilder nameBuilder = new SpannableStringBuilder(name);
        if (recipient.isSystemContact() && !recipient.isSelf()) {
            Drawable systemContact = DrawableUtil.tint(ContextUtil.requireDrawable(requireContext(), R.drawable.ic_profile_circle_outline_16), ContextCompat.getColor(requireContext(), R.color.signal_text_primary));
            SpanUtil.appendCenteredImageSpan(nameBuilder, systemContact, 16, 16);
        } else if (recipient.isReleaseNotes()) {
            SpanUtil.appendCenteredImageSpan(nameBuilder, ContextUtil.requireDrawable(requireContext(), R.drawable.ic_official_28), 28, 28);
        }
        fullName.setText(nameBuilder);
        String aboutText = recipient.getCombinedAboutAndEmoji();
        if (recipient.isReleaseNotes()) {
            aboutText = getString(R.string.ReleaseNotes__signal_release_notes_and_news);
        }
        if (!Util.isEmpty(aboutText)) {
            about.setText(aboutText);
            about.setVisibility(View.VISIBLE);
        } else {
            about.setVisibility(View.GONE);
        }
        String usernameNumberString = recipient.hasAUserSetDisplayName(requireContext()) && !recipient.isSelf() ? recipient.getSmsAddress().transform(PhoneNumberFormatter::prettyPrint).or("").trim() : "";
        usernameNumber.setText(usernameNumberString);
        usernameNumber.setVisibility(TextUtils.isEmpty(usernameNumberString) ? View.GONE : View.VISIBLE);
        usernameNumber.setOnLongClickListener(v -> {
            Util.copyToClipboard(v.getContext(), usernameNumber.getText().toString());
            ServiceUtil.getVibrator(v.getContext()).vibrate(250);
            Toast.makeText(v.getContext(), R.string.RecipientBottomSheet_copied_to_clipboard, Toast.LENGTH_SHORT).show();
            return true;
        });
        noteToSelfDescription.setVisibility(recipient.isSelf() ? View.VISIBLE : View.GONE);
        if (RecipientUtil.isBlockable(recipient)) {
            boolean blocked = recipient.isBlocked();
            blockButton.setVisibility(recipient.isSelf() || blocked ? View.GONE : View.VISIBLE);
            unblockButton.setVisibility(recipient.isSelf() || !blocked ? View.GONE : View.VISIBLE);
        } else {
            blockButton.setVisibility(View.GONE);
            unblockButton.setVisibility(View.GONE);
        }
        ButtonStripPreference.State buttonStripState = new ButtonStripPreference.State(/* isMessageAvailable = */
        !recipient.isBlocked() && !recipient.isSelf() && !recipient.isReleaseNotes(), /* isVideoAvailable   = */
        !recipient.isBlocked() && !recipient.isSelf() && recipient.isRegistered(), /* isAudioAvailable   = */
        !recipient.isBlocked() && !recipient.isSelf() && !recipient.isReleaseNotes(), /* isMuteAvailable    = */
        false, /* isSearchAvailable  = */
        false, /* isAudioSecure      = */
        recipient.isRegistered(), /* isMuted            = */
        false);
        ButtonStripPreference.Model buttonStripModel = new ButtonStripPreference.Model(buttonStripState, DSLSettingsIcon.from(ContextUtil.requireDrawable(requireContext(), R.drawable.selectable_recipient_bottom_sheet_icon_button)), () -> {
            dismiss();
            viewModel.onMessageClicked(requireActivity());
            return Unit.INSTANCE;
        }, () -> {
            viewModel.onSecureVideoCallClicked(requireActivity());
            return Unit.INSTANCE;
        }, () -> {
            if (buttonStripState.isAudioSecure()) {
                viewModel.onSecureCallClicked(requireActivity());
            } else {
                viewModel.onInsecureCallClicked(requireActivity());
            }
            return Unit.INSTANCE;
        }, () -> Unit.INSTANCE, () -> Unit.INSTANCE);
        new ButtonStripPreference.ViewHolder(buttonStrip).bind(buttonStripModel);
        if (recipient.isReleaseNotes()) {
            buttonStrip.setVisibility(View.GONE);
        }
        if (recipient.isSystemContact() || recipient.isGroup() || recipient.isSelf() || recipient.isBlocked() || recipient.isReleaseNotes()) {
            addContactButton.setVisibility(View.GONE);
        } else {
            addContactButton.setVisibility(View.VISIBLE);
            addContactButton.setOnClickListener(v -> {
                openSystemContactSheet(RecipientExporter.export(recipient).asAddContactIntent());
            });
        }
        if (recipient.isSystemContact() && !recipient.isGroup() && !recipient.isSelf()) {
            contactDetailsButton.setVisibility(View.VISIBLE);
            contactDetailsButton.setOnClickListener(v -> {
                openSystemContactSheet(new Intent(Intent.ACTION_VIEW, recipient.getContactUri()));
            });
        } else {
            contactDetailsButton.setVisibility(View.GONE);
        }
    });
    viewModel.getCanAddToAGroup().observe(getViewLifecycleOwner(), canAdd -> {
        addToGroupButton.setText(groupId == null ? R.string.RecipientBottomSheet_add_to_a_group : R.string.RecipientBottomSheet_add_to_another_group);
        addToGroupButton.setVisibility(canAdd ? View.VISIBLE : View.GONE);
    });
    viewModel.getAdminActionStatus().observe(getViewLifecycleOwner(), adminStatus -> {
        makeGroupAdminButton.setVisibility(adminStatus.isCanMakeAdmin() ? View.VISIBLE : View.GONE);
        removeAdminButton.setVisibility(adminStatus.isCanMakeNonAdmin() ? View.VISIBLE : View.GONE);
        removeFromGroupButton.setVisibility(adminStatus.isCanRemove() ? View.VISIBLE : View.GONE);
    });
    viewModel.getIdentity().observe(getViewLifecycleOwner(), identityRecord -> {
        viewSafetyNumberButton.setVisibility(identityRecord != null ? View.VISIBLE : View.GONE);
        if (identityRecord != null) {
            viewSafetyNumberButton.setOnClickListener(view -> {
                dismiss();
                viewModel.onViewSafetyNumberClicked(requireActivity(), identityRecord);
            });
        }
    });
    avatar.setOnClickListener(view -> {
        dismiss();
        viewModel.onAvatarClicked(requireActivity());
    });
    badgeImageView.setOnClickListener(view -> {
        dismiss();
        ViewBadgeBottomSheetDialogFragment.show(getParentFragmentManager(), recipientId, null);
    });
    blockButton.setOnClickListener(view -> viewModel.onBlockClicked(requireActivity()));
    unblockButton.setOnClickListener(view -> viewModel.onUnblockClicked(requireActivity()));
    makeGroupAdminButton.setOnClickListener(view -> viewModel.onMakeGroupAdminClicked(requireActivity()));
    removeAdminButton.setOnClickListener(view -> viewModel.onRemoveGroupAdminClicked(requireActivity()));
    removeFromGroupButton.setOnClickListener(view -> viewModel.onRemoveFromGroupClicked(requireActivity(), this::dismiss));
    addToGroupButton.setOnClickListener(view -> {
        dismiss();
        viewModel.onAddToGroupButton(requireActivity());
    });
    viewModel.getAdminActionBusy().observe(getViewLifecycleOwner(), busy -> {
        adminActionBusy.setVisibility(busy ? View.VISIBLE : View.GONE);
        makeGroupAdminButton.setEnabled(!busy);
        removeAdminButton.setEnabled(!busy);
        removeFromGroupButton.setEnabled(!busy);
    });
}
Also used : RecipientId(org.thoughtcrime.securesms.recipients.RecipientId) Bundle(android.os.Bundle) Drawable(android.graphics.drawable.Drawable) Recipient(org.thoughtcrime.securesms.recipients.Recipient) Intent(android.content.Intent) SpannableString(android.text.SpannableString) GroupId(org.thoughtcrime.securesms.groups.GroupId) FallbackContactPhoto(org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto) NonNull(androidx.annotation.NonNull) FallbackPhoto80dp(org.thoughtcrime.securesms.contacts.avatars.FallbackPhoto80dp) SpannableStringBuilder(android.text.SpannableStringBuilder) ButtonStripPreference(org.thoughtcrime.securesms.components.settings.conversation.preferences.ButtonStripPreference)

Example 17 with GroupId

use of org.thoughtcrime.securesms.groups.GroupId in project Signal-Android by WhisperSystems.

the class ReviewUtil method getDuplicatedRecipients.

@WorkerThread
@NonNull
public static List<ReviewRecipient> getDuplicatedRecipients(@NonNull GroupId.V2 groupId) {
    Context context = ApplicationDependencies.getApplication();
    List<MessageRecord> profileChangeRecords = getProfileChangeRecordsForGroup(context, groupId);
    if (profileChangeRecords.isEmpty()) {
        return Collections.emptyList();
    }
    List<Recipient> members = SignalDatabase.groups().getGroupMembers(groupId, GroupDatabase.MemberSet.FULL_MEMBERS_INCLUDING_SELF);
    List<ReviewRecipient> changed = Stream.of(profileChangeRecords).distinctBy(record -> record.getRecipient().getId()).map(record -> new ReviewRecipient(record.getRecipient().resolve(), getProfileChangeDetails(record))).filter(recipient -> !recipient.getRecipient().isSystemContact()).toList();
    List<ReviewRecipient> results = new LinkedList<>();
    for (ReviewRecipient recipient : changed) {
        if (results.contains(recipient)) {
            continue;
        }
        members.remove(recipient.getRecipient());
        for (Recipient member : members) {
            if (Objects.equals(member.getDisplayName(context), recipient.getRecipient().getDisplayName(context))) {
                results.add(recipient);
                results.add(new ReviewRecipient(member));
            }
        }
    }
    return results;
}
Also used : Context(android.content.Context) Context(android.content.Context) SignalDatabase(org.thoughtcrime.securesms.database.SignalDatabase) Stream(com.annimon.stream.Stream) NonNull(androidx.annotation.NonNull) Base64(org.thoughtcrime.securesms.util.Base64) ApplicationDependencies(org.thoughtcrime.securesms.dependencies.ApplicationDependencies) WorkerThread(androidx.annotation.WorkerThread) IOException(java.io.IOException) GroupDatabase(org.thoughtcrime.securesms.database.GroupDatabase) MessageRecord(org.thoughtcrime.securesms.database.model.MessageRecord) Objects(java.util.Objects) TimeUnit(java.util.concurrent.TimeUnit) List(java.util.List) ProfileChangeDetails(org.thoughtcrime.securesms.database.model.databaseprotos.ProfileChangeDetails) RecipientId(org.thoughtcrime.securesms.recipients.RecipientId) GroupId(org.thoughtcrime.securesms.groups.GroupId) Recipient(org.thoughtcrime.securesms.recipients.Recipient) LinkedList(java.util.LinkedList) Collections(java.util.Collections) MessageRecord(org.thoughtcrime.securesms.database.model.MessageRecord) Recipient(org.thoughtcrime.securesms.recipients.Recipient) LinkedList(java.util.LinkedList) WorkerThread(androidx.annotation.WorkerThread) NonNull(androidx.annotation.NonNull)

Example 18 with GroupId

use of org.thoughtcrime.securesms.groups.GroupId in project Signal-Android by WhisperSystems.

the class GroupLinkBottomSheetDialogFragment method onCreateView.

@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.group_link_share_bottom_sheet, container, false);
    View shareViaSignalButton = view.findViewById(R.id.group_link_bottom_sheet_share_via_signal_button);
    View copyButton = view.findViewById(R.id.group_link_bottom_sheet_copy_button);
    View viewQrButton = view.findViewById(R.id.group_link_bottom_sheet_qr_code_button);
    View shareBySystemButton = view.findViewById(R.id.group_link_bottom_sheet_share_via_system_button);
    TextView hint = view.findViewById(R.id.group_link_bottom_sheet_hint);
    GroupId.V2 groupId = GroupId.parseOrThrow(Objects.requireNonNull(requireArguments().getString(ARG_GROUP_ID))).requireV2();
    LiveGroup liveGroup = new LiveGroup(groupId);
    liveGroup.getGroupLink().observe(getViewLifecycleOwner(), groupLink -> {
        if (!groupLink.isEnabled()) {
            Toast.makeText(requireContext(), R.string.GroupLinkBottomSheet_the_link_is_not_currently_active, Toast.LENGTH_SHORT).show();
            dismiss();
            return;
        }
        hint.setText(groupLink.isRequiresApproval() ? R.string.GroupLinkBottomSheet_share_hint_requiring_approval : R.string.GroupLinkBottomSheet_share_hint_not_requiring_approval);
        hint.setVisibility(View.VISIBLE);
        shareViaSignalButton.setOnClickListener(v -> {
            Context context = requireContext();
            Intent intent = new Intent(context, ShareActivity.class);
            intent.putExtra(Intent.EXTRA_TEXT, groupLink.getUrl());
            context.startActivity(intent);
            dismiss();
        });
        copyButton.setOnClickListener(v -> {
            Context context = requireContext();
            Util.copyToClipboard(context, groupLink.getUrl());
            Toast.makeText(context, R.string.GroupLinkBottomSheet_copied_to_clipboard, Toast.LENGTH_SHORT).show();
            dismiss();
        });
        viewQrButton.setOnClickListener(v -> {
            GroupLinkShareQrDialogFragment.show(requireFragmentManager(), groupId);
            dismiss();
        });
        shareBySystemButton.setOnClickListener(v -> {
            ShareCompat.IntentBuilder.from(requireActivity()).setType("text/plain").setText(groupLink.getUrl()).startChooser();
            dismiss();
        });
    });
    return view;
}
Also used : LiveGroup(org.thoughtcrime.securesms.groups.LiveGroup) Context(android.content.Context) TextView(android.widget.TextView) Intent(android.content.Intent) TextView(android.widget.TextView) View(android.view.View) GroupId(org.thoughtcrime.securesms.groups.GroupId)

Example 19 with GroupId

use of org.thoughtcrime.securesms.groups.GroupId in project Signal-Android by WhisperSystems.

the class SignalCallManager method peekGroupCallForRingingCheck.

public void peekGroupCallForRingingCheck(@NonNull GroupCallRingCheckInfo info) {
    if (callManager == null) {
        Log.i(TAG, "Unable to peekGroupCall, call manager is null");
        return;
    }
    networkExecutor.execute(() -> {
        try {
            Recipient group = Recipient.resolved(info.getRecipientId());
            GroupId.V2 groupId = group.requireGroupId().requireV2();
            GroupExternalCredential credential = GroupManager.getGroupExternalCredential(context, groupId);
            List<GroupCall.GroupMemberInfo> members = GroupManager.getUuidCipherTexts(context, groupId).entrySet().stream().map(entry -> new GroupCall.GroupMemberInfo(entry.getKey(), entry.getValue().serialize())).collect(Collectors.toList());
            callManager.peekGroupCall(SignalStore.internalValues().groupCallingServer(), credential.getTokenBytes().toByteArray(), members, peekInfo -> {
                receivedGroupCallPeekForRingingCheck(info, peekInfo.getDeviceCount());
            });
        } catch (IOException | VerificationFailedException | CallException e) {
            Log.e(TAG, "error peeking for ringing check", e);
        }
    });
}
Also used : SignalStore(org.thoughtcrime.securesms.keyvalue.SignalStore) SignalAudioManager(org.thoughtcrime.securesms.webrtc.audio.SignalAudioManager) SignalServiceAccountManager(org.whispersystems.signalservice.api.SignalServiceAccountManager) NetworkRoute(org.signal.ringrtc.NetworkRoute) BubbleUtil(org.thoughtcrime.securesms.util.BubbleUtil) SendMessageResult(org.whispersystems.signalservice.api.messages.SendMessageResult) CallingResponse(org.whispersystems.signalservice.api.messages.calls.CallingResponse) TurnServerInfo(org.whispersystems.signalservice.api.messages.calls.TurnServerInfo) NonNull(androidx.annotation.NonNull) RecipientUtil(org.thoughtcrime.securesms.recipients.RecipientUtil) CallException(org.signal.ringrtc.CallException) WebRtcCallActivity(org.thoughtcrime.securesms.WebRtcCallActivity) CallManager(org.signal.ringrtc.CallManager) RecipientId(org.thoughtcrime.securesms.recipients.RecipientId) NetworkUtil(org.thoughtcrime.securesms.util.NetworkUtil) Recipient(org.thoughtcrime.securesms.recipients.Recipient) IDLE(org.thoughtcrime.securesms.events.WebRtcViewModel.GroupCallState.IDLE) SignalExecutors(org.signal.core.util.concurrent.SignalExecutors) WebRtcUtil.getUrgencyFromCallUrgency(org.thoughtcrime.securesms.service.webrtc.WebRtcUtil.getUrgencyFromCallUrgency) GroupExternalCredential(org.signal.storageservice.protos.groups.GroupExternalCredential) ACI(org.whispersystems.signalservice.api.push.ACI) HttpHeader(org.signal.ringrtc.HttpHeader) ApplicationDependencies(org.thoughtcrime.securesms.dependencies.ApplicationDependencies) Collection(java.util.Collection) GroupCallUpdateSendJob(org.thoughtcrime.securesms.jobs.GroupCallUpdateSendJob) Set(java.util.Set) UnidentifiedAccessUtil(org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil) UUID(java.util.UUID) GroupDatabase(org.thoughtcrime.securesms.database.GroupDatabase) UNTRUSTED_IDENTITY(org.thoughtcrime.securesms.events.WebRtcViewModel.State.UNTRUSTED_IDENTITY) Collectors(java.util.stream.Collectors) Executors(java.util.concurrent.Executors) InvalidInputException(org.signal.zkgroup.InvalidInputException) GroupCall(org.signal.ringrtc.GroupCall) Log(org.signal.core.util.logging.Log) List(java.util.List) Nullable(androidx.annotation.Nullable) Application(android.app.Application) GroupId(org.thoughtcrime.securesms.groups.GroupId) CallId(org.signal.ringrtc.CallId) CameraEventListener(org.thoughtcrime.securesms.ringrtc.CameraEventListener) Context(android.content.Context) RecipientAccessList(org.thoughtcrime.securesms.util.RecipientAccessList) SignalDatabase(org.thoughtcrime.securesms.database.SignalDatabase) RemotePeer(org.thoughtcrime.securesms.ringrtc.RemotePeer) Stream(com.annimon.stream.Stream) Remote(org.signal.ringrtc.Remote) Util(org.thoughtcrime.securesms.util.Util) VerificationFailedException(org.signal.zkgroup.VerificationFailedException) Intent(android.content.Intent) AppForegroundObserver(org.thoughtcrime.securesms.util.AppForegroundObserver) RetrieveProfileJob(org.thoughtcrime.securesms.jobs.RetrieveProfileJob) NETWORK_FAILURE(org.thoughtcrime.securesms.events.WebRtcViewModel.State.NETWORK_FAILURE) OfferMessage(org.whispersystems.signalservice.api.messages.calls.OfferMessage) LockManager(org.thoughtcrime.securesms.webrtc.locks.LockManager) TextSecurePreferences(org.thoughtcrime.securesms.util.TextSecurePreferences) OpaqueMessage(org.whispersystems.signalservice.api.messages.calls.OpaqueMessage) GroupManager(org.thoughtcrime.securesms.groups.GroupManager) CameraState(org.thoughtcrime.securesms.ringrtc.CameraState) Pair(org.whispersystems.libsignal.util.Pair) EventBus(org.greenrobot.eventbus.EventBus) SignalServiceCallMessage(org.whispersystems.signalservice.api.messages.calls.SignalServiceCallMessage) Build(android.os.Build) LinkedList(java.util.LinkedList) GroupSendUtil(org.thoughtcrime.securesms.messages.GroupSendUtil) WebRtcServiceState(org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceState) ExecutorService(java.util.concurrent.ExecutorService) SignalServiceMessageSender(org.whispersystems.signalservice.api.SignalServiceMessageSender) PeerConnection(org.webrtc.PeerConnection) Executor(java.util.concurrent.Executor) WebRtcViewModel(org.thoughtcrime.securesms.events.WebRtcViewModel) IOException(java.io.IOException) NO_SUCH_USER(org.thoughtcrime.securesms.events.WebRtcViewModel.State.NO_SUCH_USER) GroupCallPeekEvent(org.thoughtcrime.securesms.events.GroupCallPeekEvent) Optional(org.whispersystems.libsignal.util.guava.Optional) UnregisteredUserException(org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException) GroupIdentifier(org.signal.zkgroup.groups.GroupIdentifier) UntrustedIdentityException(org.whispersystems.signalservice.api.crypto.UntrustedIdentityException) CALL_INCOMING(org.thoughtcrime.securesms.events.WebRtcViewModel.State.CALL_INCOMING) ResultReceiver(android.os.ResultReceiver) Collections(java.util.Collections) CallException(org.signal.ringrtc.CallException) Recipient(org.thoughtcrime.securesms.recipients.Recipient) IOException(java.io.IOException) GroupExternalCredential(org.signal.storageservice.protos.groups.GroupExternalCredential) GroupId(org.thoughtcrime.securesms.groups.GroupId) VerificationFailedException(org.signal.zkgroup.VerificationFailedException)

Example 20 with GroupId

use of org.thoughtcrime.securesms.groups.GroupId in project Signal-Android by WhisperSystems.

the class SignalCallManager method onGroupCallRingUpdate.

@Override
public void onGroupCallRingUpdate(@NonNull byte[] groupIdBytes, long ringId, @NonNull UUID uuid, @NonNull CallManager.RingUpdate ringUpdate) {
    try {
        GroupId.V2 groupId = GroupId.v2(new GroupIdentifier(groupIdBytes));
        Optional<GroupDatabase.GroupRecord> group = SignalDatabase.groups().getGroup(groupId);
        if (group.isPresent()) {
            process((s, p) -> p.handleGroupCallRingUpdate(s, new RemotePeer(group.get().getRecipientId()), groupId, ringId, uuid, ringUpdate));
        } else {
            Log.w(TAG, "Unable to ring unknown group.");
        }
    } catch (InvalidInputException e) {
        Log.w(TAG, "Unable to ring group due to invalid group id", e);
    }
}
Also used : InvalidInputException(org.signal.zkgroup.InvalidInputException) RemotePeer(org.thoughtcrime.securesms.ringrtc.RemotePeer) GroupId(org.thoughtcrime.securesms.groups.GroupId) GroupIdentifier(org.signal.zkgroup.groups.GroupIdentifier)

Aggregations

GroupId (org.thoughtcrime.securesms.groups.GroupId)41 Recipient (org.thoughtcrime.securesms.recipients.Recipient)26 NonNull (androidx.annotation.NonNull)22 RecipientId (org.thoughtcrime.securesms.recipients.RecipientId)13 Context (android.content.Context)12 List (java.util.List)11 Log (org.signal.core.util.logging.Log)11 GroupDatabase (org.thoughtcrime.securesms.database.GroupDatabase)11 Collections (java.util.Collections)10 SignalDatabase (org.thoughtcrime.securesms.database.SignalDatabase)10 ApplicationDependencies (org.thoughtcrime.securesms.dependencies.ApplicationDependencies)10 Optional (org.whispersystems.libsignal.util.guava.Optional)10 Nullable (androidx.annotation.Nullable)9 IOException (java.io.IOException)9 LinkedList (java.util.LinkedList)8 Collectors (java.util.stream.Collectors)8 SignalStore (org.thoughtcrime.securesms.keyvalue.SignalStore)8 SendMessageResult (org.whispersystems.signalservice.api.messages.SendMessageResult)8 Intent (android.content.Intent)7 Stream (com.annimon.stream.Stream)7