Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion room/tuiroomkit/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@

<activity
android:name=".RoomMainActivity"
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"
android:exported="false"
android:screenOrientation="portrait" />
android:screenOrientation="locked" />

<activity
android:name=".aitranscription.AITranscriptionSettingActivity"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,12 @@
package com.trtc.uikit.roomkit

import android.content.res.Configuration
import android.os.Bundle
import android.view.View
import android.view.WindowManager
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import com.tencent.cloud.tuikit.engine.common.ContextProvider
import com.trtc.uikit.roomkit.view.RoomMainView
import io.trtc.tuikit.atomicx.common.FullScreenActivity
Expand Down Expand Up @@ -57,9 +61,15 @@ class RoomMainActivity : FullScreenActivity() {

val roomType = if (isWebinarRoom(roomID)) RoomType.WEBINAR else RoomType.STANDARD
roomMainView?.init(roomID, roomType, behavior, config)
applySystemBarStyle(resources.configuration.orientation)
startForegroundService()
}

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
applySystemBarStyle(newConfig.orientation)
}

override fun onDestroy() {
super.onDestroy()
stopForegroundService()
Expand All @@ -70,6 +80,18 @@ class RoomMainActivity : FullScreenActivity() {
override fun onBackPressed() {
}

private fun applySystemBarStyle(orientation: Int) {
val controller = WindowInsetsControllerCompat(window, window.decorView)
WindowCompat.setDecorFitsSystemWindows(window, false)
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
controller.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
controller.hide(WindowInsetsCompat.Type.systemBars())
} else {
controller.show(WindowInsetsCompat.Type.systemBars())
}
}

private fun startForegroundService() {
val context = ContextProvider.getApplicationContext()
VideoForegroundService.start(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package com.trtc.uikit.roomkit.view

import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.content.Context
import android.content.Intent
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.ImageView
import androidx.core.content.ContextCompat
import com.trtc.uikit.roomkit.R
import com.trtc.uikit.roomkit.aitranscription.AIMinutesActivity
Expand All @@ -29,8 +33,8 @@ import com.trtc.uikit.roomkit.base.ui.RoomAlertDialog
import com.trtc.uikit.roomkit.view.main.ParticipantManagerView
import com.trtc.uikit.roomkit.view.main.RoomBottomBarView
import com.trtc.uikit.roomkit.view.main.RoomBottomBarViewListener
import com.trtc.uikit.roomkit.view.main.RoomTopBarView
import com.trtc.uikit.roomkit.view.main.RoomRecordingFloatingView
import com.trtc.uikit.roomkit.view.main.RoomTopBarView
import com.trtc.uikit.roomkit.view.main.RoomView
import com.trtc.uikit.roomkit.view.main.screenshare.ScreenShareOverlayView
import io.trtc.tuikit.atomicx.widget.basicwidget.toast.AtomicToast
Expand All @@ -46,12 +50,13 @@ import io.trtc.tuikit.atomicxcore.api.room.CreateRoomOptions
import io.trtc.tuikit.atomicxcore.api.room.DeviceRequestInfo
import io.trtc.tuikit.atomicxcore.api.room.KickedOutOfRoomReason
import io.trtc.tuikit.atomicxcore.api.room.ParticipantRole
import io.trtc.tuikit.atomicxcore.api.room.RecordingStatus
import io.trtc.tuikit.atomicxcore.api.room.RecordingStopReason
import io.trtc.tuikit.atomicxcore.api.room.RoomInfo
import io.trtc.tuikit.atomicxcore.api.room.RoomListener
import io.trtc.tuikit.atomicxcore.api.room.RoomParticipant
import io.trtc.tuikit.atomicxcore.api.room.RoomParticipantListener
import io.trtc.tuikit.atomicxcore.api.room.RoomParticipantStore
import io.trtc.tuikit.atomicxcore.api.room.RecordingStopReason
import io.trtc.tuikit.atomicxcore.api.room.RoomStore
import io.trtc.tuikit.atomicxcore.api.room.RoomType
import io.trtc.tuikit.atomicxcore.api.room.RoomUser
Expand Down Expand Up @@ -105,6 +110,8 @@ class RoomMainView @JvmOverloads constructor(
private val barrageStreamView: BarrageStreamView by lazy { findViewById(R.id.barrage_stream_view) }
private val screenShareOverlayView: ScreenShareOverlayView by lazy { findViewById(R.id.screen_share_overlay_view) }
private val recordingFloatingView: RoomRecordingFloatingView by lazy { findViewById(R.id.recording_floating_view) }
private val orientationSwitchButton: ImageView by lazy { findViewById(R.id.orientation_switch_button) }
private var currentScreenSharerID: String? = null

private var roomType = RoomType.STANDARD
private val roomStore = RoomStore.shared()
Expand Down Expand Up @@ -337,12 +344,21 @@ class RoomMainView @JvmOverloads constructor(
barrageStreamView.visibility = GONE
}
RoomDataReporter.reportComponent()
orientationSwitchButton.setOnClickListener {
switchOrientation()
}
updateOrientationVisibility(resources.configuration.orientation)
when (behavior) {
is RoomBehavior.Create -> createRoom(roomID, behavior.options)
is RoomBehavior.Join -> joinRoom(roomID)
}
}

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
updateOrientationVisibility(newConfig.orientation)
}

override fun initStore(roomID: String) {
participantStore = RoomParticipantStore.create(roomID)
}
Expand All @@ -358,6 +374,12 @@ class RoomMainView @JvmOverloads constructor(
.distinctUntilChanged()
.collect { screenShareOverlayView.updateScreenStatus(it) }
}
scope.launch {
participantStore.state.participantWithScreen
.map { it?.userID }
.distinctUntilChanged()
.collect(::onScreenSharerChanged)
}
}

override fun removeObserver() {
Expand Down Expand Up @@ -698,6 +720,67 @@ class RoomMainView @JvmOverloads constructor(
return AIMinutesActivity.getForegroundInstance() ?: context
}

private fun updateOrientationVisibility(orientation: Int) {
val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE
topBarView.visibility = if (isLandscape) GONE else VISIBLE
bottomBarView.visibility = if (isLandscape) GONE else VISIBLE
if (isLandscape) aiSubtitleView.visibility = GONE
if (roomType == RoomType.WEBINAR) {
barrageInputView.visibility = if (isLandscape) GONE else VISIBLE
barrageStreamView.visibility = if (isLandscape) GONE else VISIBLE
}
recordingFloatingView.visibility = when {
isLandscape -> GONE
roomStore.state.currentRoom.value?.recordingInfo?.status == RecordingStatus.RECORDING -> VISIBLE
else -> GONE
}
updateOrientationSwitchButtonVisibility(orientation)
}

private fun updateOrientationSwitchButtonVisibility(
orientation: Int = resources.configuration.orientation
) {
val hasRemoteSharer = currentScreenSharerID != null && currentScreenSharerID != localUserID
val shouldShow = roomType != RoomType.WEBINAR && hasRemoteSharer
orientationSwitchButton.visibility = if (shouldShow) VISIBLE else GONE
val isLandscape = orientation == Configuration.ORIENTATION_LANDSCAPE
orientationSwitchButton.setImageResource(
if (isLandscape) R.drawable.roomkit_ic_switch_portrait_button
else R.drawable.roomkit_ic_switch_landscape_button
)
}

@SuppressLint("SourceLockedOrientationActivity")
private fun switchOrientation() {
val activity = context as? Activity ?: return
val currentlyLandscape =
resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
activity.requestedOrientation = if (currentlyLandscape) {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
} else {
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
}
}

@SuppressLint("SourceLockedOrientationActivity")
private fun forcePortraitIfLandscape() {
val activity = context as? Activity ?: return
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
activity.requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}

private fun onScreenSharerChanged(newSharerID: String?) {
if (currentScreenSharerID == newSharerID) {
return
}
currentScreenSharerID = newSharerID
updateOrientationSwitchButtonVisibility()
if (newSharerID.isNullOrEmpty()) {
forcePortraitIfLandscape()
}
}

fun isAISubtitleVisible(): Boolean {
return aiSubtitleView.visibility == VISIBLE
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.trtc.uikit.roomkit.view.main.roomview

import android.content.res.Configuration
import android.graphics.PointF
import android.view.View
import android.view.ViewGroup
Expand Down Expand Up @@ -71,6 +72,7 @@ class PagedVideoLayoutManager(

private var scrollState = RecyclerView.SCROLL_STATE_IDLE
private var lastSpeakerMode = false
private var attachedRecyclerView: RecyclerView? = null

override fun generateDefaultLayoutParams(): RecyclerView.LayoutParams {
val params = RecyclerView.LayoutParams(
Expand All @@ -82,7 +84,11 @@ class PagedVideoLayoutManager(
return params
}

override fun canScrollHorizontally(): Boolean = true
override fun canScrollHorizontally(): Boolean {
val orientation = attachedRecyclerView?.resources?.configuration?.orientation
?: Configuration.ORIENTATION_PORTRAIT
return orientation != Configuration.ORIENTATION_LANDSCAPE
}

override fun onLayoutChildren(recycler: RecyclerView.Recycler, state: RecyclerView.State) {
if (state.isPreLayout) return
Expand Down Expand Up @@ -118,6 +124,7 @@ class PagedVideoLayoutManager(
override fun onAttachedToWindow(view: RecyclerView) {
super.onAttachedToWindow(view)
cachedAdapter = view.adapter
attachedRecyclerView = view

// Listen to scroll state changes
view.addOnScrollListener(object : RecyclerView.OnScrollListener() {
Expand All @@ -127,6 +134,11 @@ class PagedVideoLayoutManager(
})
}

override fun onDetachedFromWindow(view: RecyclerView, recycler: RecyclerView.Recycler) {
super.onDetachedFromWindow(view, recycler)
attachedRecyclerView = null
}

/**
* Check if speaker mode is active
* Speaker mode is ON when first item is screen share stream
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions room/tuiroomkit/src/main/res/layout/roomkit_main_view.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/roomkit_color_room_background">
Expand All @@ -22,6 +23,17 @@
app:layout_constraintTop_toBottomOf="@id/room_top_bar"
app:layout_constraintVertical_weight="1" />

<ImageView
android:id="@+id/orientation_switch_button"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginEnd="12dp"
android:layout_marginBottom="12dp"
android:src="@drawable/roomkit_ic_switch_landscape_button"
app:layout_constraintBottom_toBottomOf="@+id/room_view"
app:layout_constraintEnd_toEndOf="@+id/room_view"
tools:ignore="ContentDescription" />

<com.trtc.uikit.roomkit.aitranscription.subtitleview.AISubtitleView
android:id="@+id/ai_subtitle_view"
android:layout_width="0dp"
Expand Down