David Liu

display identities and no video indicator

... ... @@ -117,6 +117,7 @@
</codeStyleSettings>
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
<option name="RIGHT_MARGIN" value="120" />
</codeStyleSettings>
</code_scheme>
</component>
\ No newline at end of file
... ...
... ... @@ -5,6 +5,7 @@ import android.media.AudioManager
import android.media.projection.MediaProjectionManager
import android.os.Bundle
import android.os.Parcelable
import android.view.View
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.LinearLayoutManager
... ... @@ -72,7 +73,7 @@ class CallActivity : AppCompatActivity() {
// speaker view setup
viewModel.room.take(1).observe(this) { room ->
room.initVideoRenderer(binding.speakerView)
room.initVideoRenderer(binding.speakerVideoView)
viewModel.activeSpeaker
.scan(Pair<Participant?, Participant?>(null, null)) { pair, participant ->
// old participant is first
... ... @@ -83,13 +84,19 @@ class CallActivity : AppCompatActivity() {
oldSpeaker?.videoTracks
?.values
?.forEach { trackPublication ->
(trackPublication.track as? VideoTrack)?.removeRenderer(binding.speakerView)
(trackPublication.track as? VideoTrack)?.removeRenderer(binding.speakerVideoView)
}
binding.identityText.text = newSpeaker?.identity
val videoTrack = newSpeaker?.videoTracks?.values
?.firstOrNull()
?.track as? VideoTrack
videoTrack?.addRenderer(binding.speakerView)
if (videoTrack != null) {
videoTrack.addRenderer(binding.speakerVideoView)
binding.speakerVideoView.visibility = View.VISIBLE
} else {
binding.speakerVideoView.visibility = View.INVISIBLE
}
}
}
... ... @@ -156,7 +163,7 @@ class CallActivity : AppCompatActivity() {
super.onDestroy()
// Release video views
binding.speakerView.release()
binding.speakerVideoView.release()
// Undo audio mode changes
val audioManager = getSystemService(AUDIO_SERVICE) as AudioManager
... ...
... ... @@ -14,10 +14,9 @@ import io.livekit.android.sample.databinding.ParticipantItemBinding
class ParticipantItem(
val room: Room,
val participant: Participant
) :
BindableItem<ParticipantItemBinding>() {
) : BindableItem<ParticipantItemBinding>() {
private var videoBound = false
private var boundVideoTrack: VideoTrack? = null
override fun initializeViewBinding(view: View): ParticipantItemBinding {
val binding = ParticipantItemBinding.bind(view)
... ... @@ -26,8 +25,7 @@ class ParticipantItem(
}
override fun bind(viewBinding: ParticipantItemBinding, position: Int) {
viewBinding.run {
viewBinding.identityText.text = participant.identity
participant.listener = object : ParticipantListener {
override fun onTrackSubscribed(
track: Track,
... ... @@ -53,25 +51,25 @@ class ParticipantItem(
setupVideoIfNeeded(existingTrack, viewBinding)
}
}
}
private fun getVideoTrack(): VideoTrack? {
return participant.getTrackPublication(Track.Source.CAMERA)?.track as? VideoTrack
}
internal fun setupVideoIfNeeded(videoTrack: VideoTrack, viewBinding: ParticipantItemBinding) {
if (videoBound) {
if (boundVideoTrack != null) {
return
}
videoBound = true
boundVideoTrack = videoTrack
Timber.v { "adding renderer to $videoTrack" }
videoTrack.addRenderer(viewBinding.renderer)
}
override fun unbind(viewHolder: GroupieViewHolder<ParticipantItemBinding>) {
super.unbind(viewHolder)
videoBound = false
boundVideoTrack?.removeRenderer(viewHolder.binding.renderer)
boundVideoTrack = null
}
override fun getLayout(): Int = R.layout.participant_item
... ...
... ... @@ -4,15 +4,64 @@
android:layout_height="match_parent"
android:keepScreenOn="true">
<io.livekit.android.renderer.TextureViewRenderer
<FrameLayout
android:id="@+id/speaker_view"
android:layout_width="0dp"
android:layout_height="0dp"
android:background="@color/no_video_background"
app:layout_constraintBottom_toTopOf="@id/audience_row"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent">
<ImageView
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_gravity="center"
android:src="@drawable/outline_videocam_off_24"
app:tint="@color/no_video_participant" />
<io.livekit.android.renderer.TextureViewRenderer
android:id="@+id/speaker_video_view"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/audience_row"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</FrameLayout>
<FrameLayout
android:id="@+id/identity_bar"
android:layout_width="0dp"
android:layout_height="30dp"
android:background="#80000000"
app:layout_constraintBottom_toBottomOf="@id/speaker_view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/mute_indicator"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="@dimen/identity_bar_padding"
android:src="@drawable/outline_mic_off_24"
app:layout_constraintBottom_toBottomOf="@id/identity_bar"
app:layout_constraintEnd_toEndOf="@id/identity_bar"
app:layout_constraintTop_toTopOf="@id/identity_bar"
app:tint="#BB0000" />
<TextView
android:id="@+id/identity_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/identity_bar_padding"
android:ellipsize="end"
app:layout_constraintBottom_toBottomOf="@id/identity_bar"
app:layout_constraintEnd_toStartOf="@id/mute_indicator"
app:layout_constraintStart_toStartOf="@id/identity_bar"
app:layout_constraintTop_toTopOf="@id/identity_bar" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/audience_row"
android:layout_width="match_parent"
... ...
... ... @@ -2,13 +2,60 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="wrap_content"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:background="@color/no_video_background">
<io.livekit.android.renderer.TextureViewRenderer
android:id="@+id/renderer"
<FrameLayout
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintDimensionRatio="1:1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
android:background="@color/no_video_background"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_gravity="center"
android:src="@drawable/outline_videocam_off_24"
app:tint="@color/no_video_participant" />
<io.livekit.android.renderer.TextureViewRenderer
android:id="@+id/renderer"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</FrameLayout>
<FrameLayout
android:id="@+id/identity_bar"
android:layout_width="0dp"
android:layout_height="30dp"
android:background="#80000000"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<ImageView
android:id="@+id/mute_indicator"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_marginEnd="@dimen/identity_bar_padding"
android:src="@drawable/outline_mic_off_24"
app:layout_constraintBottom_toBottomOf="@id/identity_bar"
app:layout_constraintEnd_toEndOf="@id/identity_bar"
app:layout_constraintTop_toTopOf="@id/identity_bar"
app:tint="#BB0000"
android:visibility="gone"
/>
<TextView
android:id="@+id/identity_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="@dimen/identity_bar_padding"
android:ellipsize="end"
app:layout_constraintBottom_toBottomOf="@id/identity_bar"
app:layout_constraintEnd_toStartOf="@id/mute_indicator"
app:layout_constraintStart_toStartOf="@id/identity_bar"
app:layout_constraintTop_toTopOf="@id/identity_bar" />
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
... ...
... ... @@ -3,4 +3,6 @@
<color name="colorPrimary">#007DFF</color>
<color name="colorPrimaryDark">#0058b3</color>
<color name="colorAccent">#66b1ff</color>
<color name="no_video_participant">#5A8BFF</color>
<color name="no_video_background">#00153C</color>
</resources>
... ...
... ... @@ -2,4 +2,5 @@
<resources>
<dimen name="control_size">40dp</dimen>
<dimen name="control_padding">4dp</dimen>
<dimen name="identity_bar_padding">4dp</dimen>
</resources>
\ No newline at end of file
... ...