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 1f6a7038c7..320725ae12 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 @@ -408,9 +408,11 @@ public class WebRtcCallViewModel extends ViewModel { groupCallState = (participantLimit == null || remoteDevicesCount < participantLimit) ? WebRtcControls.GroupCallState.CONNECTING : WebRtcControls.GroupCallState.FULL; break; + case CONNECTED_AND_PENDING: + groupCallState = WebRtcControls.GroupCallState.PENDING; + break; case CONNECTED: case CONNECTED_AND_JOINING: - case CONNECTED_AND_PENDING: case CONNECTED_AND_JOINED: groupCallState = WebRtcControls.GroupCallState.CONNECTED; break; diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java index 617ab320c7..f03c73b47f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcControls.java @@ -227,6 +227,10 @@ public final class WebRtcControls { return !isInPipMode; } + public boolean displayWaitingToBeLetIn() { + return !isInPipMode && groupCallState == GroupCallState.PENDING; + } + public @NonNull WebRtcAudioOutput getAudioOutput() { switch (activeDevice) { case SPEAKER_PHONE: @@ -282,7 +286,6 @@ public final class WebRtcControls { private int displayedButtonCount() { return (displayAudioToggle() ? 1 : 0) + - (displayCameraToggle() ? 1 : 0) + (displayVideoToggle() ? 1 : 0) + (displayMuteAudio() ? 1 : 0) + (displayRingToggle() ? 1 : 0) + @@ -312,6 +315,7 @@ public final class WebRtcControls { RECONNECTING, CONNECTING, FULL, + PENDING, CONNECTED; boolean isAtLeast(@SuppressWarnings("SameParameterValue") @NonNull GroupCallState other) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt index 8f122bb7df..a7dd3ab1fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/controls/ControlsAndInfoController.kt @@ -9,10 +9,12 @@ import android.content.ActivityNotFoundException import android.content.Intent import android.content.res.ColorStateList import android.content.res.Configuration +import android.graphics.Color import android.os.Handler import android.os.Parcelable import android.view.View import android.widget.FrameLayout +import android.widget.TextView import android.widget.Toast import androidx.annotation.IdRes import androidx.annotation.Px @@ -34,6 +36,8 @@ import com.google.android.material.bottomsheet.BottomSheetBehavior import com.google.android.material.bottomsheet.BottomSheetBehavior.BottomSheetCallback import com.google.android.material.bottomsheet.BottomSheetBehaviorHack import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.google.android.material.progressindicator.CircularProgressIndicatorSpec +import com.google.android.material.progressindicator.IndeterminateDrawable import com.google.android.material.shape.CornerFamily import com.google.android.material.shape.MaterialShapeDrawable import com.google.android.material.shape.ShapeAppearanceModel @@ -111,6 +115,20 @@ class ControlsAndInfoController private constructor( private val toggleCameraDirectionView: View = webRtcCallView.findViewById(R.id.call_screen_camera_direction_toggle) private val callControls: ConstraintLayout = webRtcCallView.findViewById(R.id.call_controls_constraint_layout) private val isLandscape = webRtcCallActivity.resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE + private val waitingToBeLetInProgressDrawable = IndeterminateDrawable.createCircularDrawable( + webRtcCallActivity, + CircularProgressIndicatorSpec(webRtcCallActivity, null).apply { + indicatorSize = 20.dp + indicatorInset = 0.dp + trackThickness = 2.dp + trackCornerRadius = 1.dp + indicatorColors = intArrayOf(ContextCompat.getColor(webRtcCallActivity, R.color.signal_colorOnBackground)) + trackColor = Color.TRANSPARENT + } + ) + private val waitingToBeLetIn: TextView = webRtcCallView.findViewById(R.id.call_controls_waiting_to_be_let_in).apply { + setCompoundDrawablesRelativeWithIntrinsicBounds(waitingToBeLetInProgressDrawable, null, null, null) + } private val scheduleHideControlsRunnable: Runnable = Runnable { onScheduledHide() } private val bottomSheetVisibilityListeners = mutableSetOf() @@ -367,6 +385,13 @@ class ControlsAndInfoController private constructor( constraints.applyTo(callControls) toggleCameraDirectionView.visible = controlState.displayCameraToggle() + waitingToBeLetIn.visible = controlState.displayWaitingToBeLetIn() + + if (controlState.displayWaitingToBeLetIn()) { + waitingToBeLetInProgressDrawable.setVisible(true, false) + } else { + waitingToBeLetInProgressDrawable.stop() + } } private fun onScheduledHide() { @@ -463,7 +488,8 @@ class ControlsAndInfoController private constructor( displayMuteAudio() != previousState.displayMuteAudio() || displayRingToggle() != previousState.displayRingToggle() || displayOverflow() != previousState.displayOverflow() || - displayEndCall() != previousState.displayEndCall() + displayEndCall() != previousState.displayEndCall() || + displayWaitingToBeLetIn() != previousState.displayWaitingToBeLetIn() } private fun alphaControls(slideOffset: Float): Float { diff --git a/app/src/main/res/drawable/rounded_8_surface1.xml b/app/src/main/res/drawable/rounded_8_surface1.xml new file mode 100644 index 0000000000..778563d7be --- /dev/null +++ b/app/src/main/res/drawable/rounded_8_surface1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout-land/webrtc_call_controls.xml b/app/src/main/res/layout-land/webrtc_call_controls.xml index de0358c961..4269a7bc89 100644 --- a/app/src/main/res/layout-land/webrtc_call_controls.xml +++ b/app/src/main/res/layout-land/webrtc_call_controls.xml @@ -81,6 +81,23 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintWidth_max="540dp" /> + + + +