diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsBottomSheet.kt index 4cd1827d92..355ac5a699 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/PendingParticipantsBottomSheet.kt @@ -83,7 +83,7 @@ class PendingParticipantsBottomSheet : ComposeBottomSheetDialogFragment() { } val participants = viewModel.pendingParticipants - .map { it.getAllPendingParticipants(launchTime).toList() } + .map { it.pendingParticipantCollection.getAllPendingParticipants(launchTime).toList() } .subscribeAsState(initial = emptyList()) PendingParticipantsSheet( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java index b3a5824252..08e068a769 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallView.java @@ -60,7 +60,7 @@ import org.thoughtcrime.securesms.permissions.Permissions; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.ringrtc.CameraState; -import org.thoughtcrime.securesms.service.webrtc.PendingParticipantCollection; +import org.thoughtcrime.securesms.service.webrtc.state.PendingParticipantsState; import org.thoughtcrime.securesms.stories.viewer.reply.reaction.MultiReactionBurstLayout; import org.thoughtcrime.securesms.util.BlurTransformation; import org.thoughtcrime.securesms.util.ThrottledDebouncer; @@ -446,15 +446,20 @@ public class WebRtcCallView extends InsetAwareConstraintLayout { pendingParticipantsViewListener = listener; } - public void updatePendingParticipantsList(@NonNull PendingParticipantCollection pendingParticipantCollection) { - if (pendingParticipantCollection.getUnresolvedPendingParticipants().isEmpty()) { + public void updatePendingParticipantsList(@NonNull PendingParticipantsState state) { + if (state.isInPipMode()) { + pendingParticipantsViewStub.setVisibility(View.GONE); + return; + } + + if (state.getPendingParticipantCollection().getUnresolvedPendingParticipants().isEmpty()) { if (pendingParticipantsViewStub.resolved()) { pendingParticipantsViewStub.get().setListener(pendingParticipantsViewListener); - pendingParticipantsViewStub.get().applyState(pendingParticipantCollection); + pendingParticipantsViewStub.get().applyState(state.getPendingParticipantCollection()); } } else { pendingParticipantsViewStub.get().setListener(pendingParticipantsViewListener); - pendingParticipantsViewStub.get().applyState(pendingParticipantCollection); + pendingParticipantsViewStub.get().applyState(state.getPendingParticipantCollection()); } } @@ -525,10 +530,8 @@ public class WebRtcCallView extends InsetAwareConstraintLayout { updateLocalCallParticipant(state.getLocalRenderState(), state.getLocalParticipant(), displaySmallSelfPipInLandscape); if (state.isLargeVideoGroup()) { - moveSnackbarAboveParticipantRail(true); adjustLayoutForLargeCount(); } else { - moveSnackbarAboveParticipantRail(state.isViewingFocusedParticipant()); adjustLayoutForSmallCount(); } } @@ -647,14 +650,6 @@ public class WebRtcCallView extends InsetAwareConstraintLayout { setStatus(getContext().getString(statusRes)); } - private @NonNull View getPipBarrier() { - if (collapsedToolbar.isEnabled()) { - return collapsedToolbar; - } else { - return largeHeader; - } - } - public void setStatusFromHangupType(@NonNull HangupMessage.Type hangupType) { switch (hangupType) { case NORMAL: @@ -904,28 +899,6 @@ public class WebRtcCallView extends InsetAwareConstraintLayout { constraintSet.applyTo(this); } - private void moveSnackbarAboveParticipantRail(boolean aboveRail) { - if (aboveRail) { - updatePendingParticipantsBottomConstraint(callParticipantsRecycler); - } else { - updatePendingParticipantsBottomConstraint(aboveControlsGuideline); - } - } - - private void updatePendingParticipantsBottomConstraint(View anchor) { - ConstraintSet constraintSet = new ConstraintSet(); - constraintSet.setForceId(false); - constraintSet.clone(this); - - constraintSet.connect(R.id.call_screen_pending_recipients, - ConstraintSet.BOTTOM, - anchor.getId(), - ConstraintSet.TOP, - ViewUtil.dpToPx(8)); - - constraintSet.applyTo(this); - } - private void fadeInNewUiState(boolean showSmallHeader) { for (View view : SetUtil.difference(allTimeVisibleViews, visibleViewSet)) { view.setVisibility(GONE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java index c9625a67a9..03988cab52 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallViewModel.java @@ -33,6 +33,7 @@ import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.service.webrtc.PendingParticipantCollection; +import org.thoughtcrime.securesms.service.webrtc.state.PendingParticipantsState; import org.thoughtcrime.securesms.service.webrtc.state.WebRtcEphemeralState; import org.thoughtcrime.securesms.util.NetworkUtil; import org.thoughtcrime.securesms.util.SingleLiveEvent; @@ -220,8 +221,12 @@ public class WebRtcCallViewModel extends ViewModel { return callStarting; } - public @NonNull Observable getPendingParticipants() { - return pendingParticipants.observeOn(AndroidSchedulers.mainThread()); + public @NonNull Observable getPendingParticipants() { + Observable isInPipMode = participantsState + .map(CallParticipantsState::isInPipMode) + .distinctUntilChanged(); + + return Observable.combineLatest(pendingParticipants, isInPipMode, PendingParticipantsState::new); } public @NonNull PendingParticipantCollection getPendingParticipantsSnapshot() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/PendingParticipantsState.kt b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/PendingParticipantsState.kt new file mode 100644 index 0000000000..e986794a04 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/state/PendingParticipantsState.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.service.webrtc.state + +import org.thoughtcrime.securesms.service.webrtc.PendingParticipantCollection + +/** + * Represents the current state of the pending participants card. + */ +data class PendingParticipantsState( + val pendingParticipantCollection: PendingParticipantCollection, + val isInPipMode: Boolean +) \ No newline at end of file diff --git a/app/src/main/res/layout/webrtc_call_controls.xml b/app/src/main/res/layout/webrtc_call_controls.xml index 8718e4bb32..18abcbd2b4 100644 --- a/app/src/main/res/layout/webrtc_call_controls.xml +++ b/app/src/main/res/layout/webrtc_call_controls.xml @@ -56,19 +56,19 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginBottom="12dp" - app:layout_goneMarginBottom="32dp" app:layout_constraintBottom_toTopOf="@id/call_screen_pending_recipients" - app:layout_constraintEnd_toEndOf="parent" /> + app:layout_constraintEnd_toEndOf="parent" + app:layout_goneMarginBottom="32dp" />