diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioIndicatorView.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioIndicatorView.kt index 8ddcaf453e1594757267653a618831aa4a8c5326..8edbcd1f037c0a5ecde1e4c1b43a8508dc537ff0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioIndicatorView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/AudioIndicatorView.kt @@ -50,12 +50,6 @@ class AudioIndicatorView(context: Context, attrs: AttributeSet) : FrameLayout(co fun bind(microphoneEnabled: Boolean, level: CallParticipant.AudioLevel?) { micMuted.visible = !microphoneEnabled - if (WebRtcActionProcessor.AUDIO_LEVELS_INTERVAL != null) { - bindAudioLevel(microphoneEnabled, level) - } - } - - private fun bindAudioLevel(microphoneEnabled: Boolean, level: CallParticipant.AudioLevel?) { val wasShowingAudioLevel = showAudioLevel showAudioLevel = microphoneEnabled && level != null @@ -95,7 +89,7 @@ class AudioIndicatorView(context: Context, attrs: AttributeSet) : FrameLayout(co val currentHeight = current?.animatedValue as? Float ?: 0f return ValueAnimator.ofFloat(currentHeight, finalHeight).apply { - duration = WebRtcActionProcessor.AUDIO_LEVELS_INTERVAL?.toLong() ?: 0 + duration = WebRtcActionProcessor.AUDIO_LEVELS_INTERVAL.toLong() interpolator = DecelerateInterpolator() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsRecyclerAdapter.java b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsRecyclerAdapter.java index 5ac32a9578ba729c3b371596a0f6c2aa8181da9c..9b2fe9b85738433d131d631803edc5c698468628 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsRecyclerAdapter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/WebRtcCallParticipantsRecyclerAdapter.java @@ -9,8 +9,10 @@ import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.ListAdapter; import androidx.recyclerview.widget.RecyclerView; +import org.signal.core.util.DimensionUnit; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.events.CallParticipant; +import org.thoughtcrime.securesms.util.ViewUtil; import org.webrtc.RendererCommon; class WebRtcCallParticipantsRecyclerAdapter extends ListAdapter<CallParticipant, WebRtcCallParticipantsRecyclerAdapter.ViewHolder> { @@ -56,6 +58,11 @@ class WebRtcCallParticipantsRecyclerAdapter extends ListAdapter<CallParticipant, ParticipantViewHolder(@NonNull View itemView) { super(itemView); callParticipantView = itemView.findViewById(R.id.call_participant); + + View audioIndicator = callParticipantView.findViewById(R.id.call_participant_audio_indicator); + int audioIndicatorMargin = (int) DimensionUnit.DP.toPixels(8f); + ViewUtil.setLeftMargin(audioIndicator, audioIndicatorMargin); + ViewUtil.setBottomMargin(audioIndicator, audioIndicatorMargin); } @Override 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 c97f6c972c80b4320bada05a41f9fe9095a1e0a1..c2d2fc97f9d151d4b040583e624063ea1344b3b7 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 @@ -20,6 +20,8 @@ import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintSet; import androidx.constraintlayout.widget.Guideline; import androidx.core.util.Consumer; +import androidx.core.view.ViewKt; +import androidx.recyclerview.widget.DefaultItemAnimator; import androidx.recyclerview.widget.RecyclerView; import androidx.transition.AutoTransition; import androidx.transition.Transition; @@ -33,6 +35,8 @@ import com.bumptech.glide.load.resource.bitmap.CenterCrop; import com.google.android.material.button.MaterialButton; import com.google.common.collect.Sets; +import org.signal.core.util.DimensionUnit; +import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.animation.ResizeAnimation; import org.thoughtcrime.securesms.components.AccessibleToggleButton; @@ -46,7 +50,6 @@ import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.ringrtc.CameraState; import org.thoughtcrime.securesms.util.BlurTransformation; -import org.signal.core.util.SetUtil; import org.thoughtcrime.securesms.util.ThrottledDebouncer; import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.views.Stub; @@ -211,6 +214,10 @@ public class WebRtcCallView extends ConstraintLayout { callParticipantsPager.setAdapter(pagerAdapter); callParticipantsRecycler.setAdapter(recyclerAdapter); + DefaultItemAnimator animator = new DefaultItemAnimator(); + animator.setSupportsChangeAnimations(false); + callParticipantsRecycler.setItemAnimator(animator); + callParticipantsPager.registerOnPageChangeCallback(new ViewPager2.OnPageChangeCallback() { @Override public void onPageSelected(int position) { @@ -266,6 +273,11 @@ public class WebRtcCallView extends ConstraintLayout { } }); + View smallLocalAudioIndicator = smallLocalRender.findViewById(R.id.call_participant_audio_indicator); + int audioIndicatorMargin = (int) DimensionUnit.DP.toPixels(8f); + ViewUtil.setLeftMargin(smallLocalAudioIndicator, audioIndicatorMargin); + ViewUtil.setBottomMargin(smallLocalAudioIndicator, audioIndicatorMargin); + startCall.setOnClickListener(v -> { if (controlsListener != null) { startCall.setEnabled(false); @@ -292,7 +304,7 @@ public class WebRtcCallView extends ConstraintLayout { rotatableControls.add(videoToggle); rotatableControls.add(cameraDirectionToggle); rotatableControls.add(decline); - rotatableControls.add(smallLocalRender.findViewById(R.id.call_participant_audio_indicator)); + rotatableControls.add(smallLocalAudioIndicator); rotatableControls.add(ringToggle); largeHeaderConstraints = new ConstraintSet(); @@ -425,6 +437,7 @@ public class WebRtcCallView extends ConstraintLayout { if (state == WebRtcLocalRenderState.EXPANDED) { expandPip(localCallParticipant, focusedParticipant); + smallLocalRender.setCallParticipant(focusedParticipant); return; } else if ((state == WebRtcLocalRenderState.SMALL_RECTANGLE || state == WebRtcLocalRenderState.GONE) && pictureInPictureExpansionHelper.isExpandedOrExpanding()) { shrinkPip(localCallParticipant); @@ -860,6 +873,11 @@ public class WebRtcCallView extends ConstraintLayout { } private void layoutParticipants() { + int desiredMargin = ViewUtil.dpToPx(withControlsHeight(pagerBottomMarginDp)); + if (ViewKt.getMarginBottom(callParticipantsPager) == desiredMargin) { + return; + } + Transition transition = new AutoTransition().setDuration(TRANSITION_DURATION_MILLIS); TransitionManager.beginDelayedTransition(participantsParent, transition); @@ -867,7 +885,7 @@ public class WebRtcCallView extends ConstraintLayout { ConstraintSet constraintSet = new ConstraintSet(); constraintSet.clone(participantsParent); - constraintSet.setMargin(R.id.call_screen_participants_pager, ConstraintSet.BOTTOM, ViewUtil.dpToPx(withControlsHeight(pagerBottomMarginDp))); + constraintSet.setMargin(R.id.call_screen_participants_pager, ConstraintSet.BOTTOM, desiredMargin); constraintSet.applyTo(participantsParent); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java index e9b38ff69f84b539f525c269ca5c117dba637066..61c2fce378881e892fde07ce1267bb6c726bb052 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/service/webrtc/WebRtcActionProcessor.java @@ -78,7 +78,7 @@ import static org.thoughtcrime.securesms.service.webrtc.WebRtcData.ReceivedAnswe */ public abstract class WebRtcActionProcessor { - @Nullable public static final Integer AUDIO_LEVELS_INTERVAL = null; + public static final int AUDIO_LEVELS_INTERVAL = 200; protected final Context context; protected final WebRtcInteractor webRtcInteractor; diff --git a/app/src/main/res/layout/call_participant_item.xml b/app/src/main/res/layout/call_participant_item.xml index 1fdd3427727ae1f7f69a1f256967894977a7b139..10d7977f68806ec1c363fe6bffa816cd51e04f6e 100644 --- a/app/src/main/res/layout/call_participant_item.xml +++ b/app/src/main/res/layout/call_participant_item.xml @@ -85,10 +85,10 @@ <org.thoughtcrime.securesms.components.webrtc.AudioIndicatorView android:id="@+id/call_participant_audio_indicator" - android:layout_width="24dp" - android:layout_height="24dp" - android:layout_marginStart="9dp" - android:layout_marginBottom="9dp" + android:layout_width="20dp" + android:layout_height="20dp" + android:layout_marginStart="14dp" + android:layout_marginBottom="14dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" />