Skip to content

Commit

Permalink
add room time state
Browse files Browse the repository at this point in the history
  • Loading branch information
AderanFeng committed Feb 18, 2024
1 parent 4fec9a0 commit df384ba
Show file tree
Hide file tree
Showing 10 changed files with 188 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,8 @@ class AgoraBoardRoom @Inject constructor(
fastRoom?.join {
cont.resume(true)
}

fastboard.setWhiteboardRatio(null)
}

private fun getCollectorStyle(): HashMap<String, String> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ class ClassRoomActivity : BaseActivity() {
componentSet.add(RtmComponent(this, binding.messageContainer))
componentSet.add(ToolComponent(this, binding.toolContainer))
componentSet.add(ClassCloudComponent(this, binding.cloudStorageContainer))
componentSet.add(ExtComponent(this, binding.extensionContainer))
componentSet.add(ExtComponent(this, binding.extensionContainer, binding.roomStateContainer))
componentSet.forEach { lifecycle.addObserver(it) }
}

Expand Down
14 changes: 14 additions & 0 deletions app/src/main/java/io/agora/flat/ui/activity/play/ExtComponent.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ import io.agora.flat.R
import io.agora.flat.common.error.FlatErrorHandler
import io.agora.flat.data.model.RoomStatus
import io.agora.flat.databinding.ComponentExtensionBinding
import io.agora.flat.databinding.ComponentRoomStateBinding
import io.agora.flat.event.RemoteLoginEvent
import io.agora.flat.ui.manager.RoomOverlayManager
import io.agora.flat.ui.util.UiMessage
import io.agora.flat.ui.view.RoomExitDialog
import io.agora.flat.ui.view.TimeStateData
import io.agora.flat.util.delayAndFinish
import io.agora.flat.util.isDarkMode
import io.agora.flat.util.showToast
Expand All @@ -31,8 +33,10 @@ import kotlinx.coroutines.flow.filterNotNull
class ExtComponent(
activity: ClassRoomActivity,
rootView: FrameLayout,
private val roomStateContainer: FrameLayout,
) : BaseComponent(activity, rootView) {
private lateinit var extensionBinding: ComponentExtensionBinding
private lateinit var roomStateBinding: ComponentRoomStateBinding

private val viewModel: ExtensionViewModel by activity.viewModels()
private val classRoomViewModel: ClassRoomViewModel by activity.viewModels()
Expand All @@ -44,6 +48,7 @@ class ExtComponent(

private fun initView() {
extensionBinding = ComponentExtensionBinding.inflate(activity.layoutInflater, rootView, true)
roomStateBinding = ComponentRoomStateBinding.inflate(activity.layoutInflater, roomStateContainer, true)
}

private fun observeState() {
Expand All @@ -61,6 +66,15 @@ class ExtComponent(
if (it.roomStatus == RoomStatus.Stopped) {
showRoomExitDialog(activity.getString(R.string.exit_room_stopped_message))
}

// TODO current version does not have an end time limit
roomStateBinding.timeStateLayout.updateTimeStateData(
TimeStateData(
it.beginTime,
Long.MAX_VALUE,
10 * 60 * 1000,
)
)
}
}

Expand Down
101 changes: 101 additions & 0 deletions app/src/main/java/io/agora/flat/ui/view/TimeStateLayout.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package io.agora.flat.ui.view

import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.FrameLayout
import android.widget.TextView
import androidx.annotation.ColorRes
import androidx.core.content.ContextCompat
import io.agora.flat.R
import io.agora.flat.databinding.LayoutTimeStateBinding
import java.util.concurrent.TimeUnit


data class TimeStateData(
val begin: Long,
val end: Long,
val endNotify: Long,
)

class TimeStateLayout @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0,
) : FrameLayout(context, attrs, defStyleAttr) {
private var binding: LayoutTimeStateBinding = LayoutTimeStateBinding.inflate(
LayoutInflater.from(context),
this,
)
private var timeStateData: TimeStateData = TimeStateData(0, Long.MAX_VALUE, 5 * 60 * 1000)

private val ticker: Runnable = object : Runnable {
override fun run() {
removeCallbacks(this)
updateView()
postDelayed(this, 1000)
}
}

fun updateTimeStateData(data: TimeStateData) {
timeStateData = data
ticker.run()
}

override fun onVisibilityAggregated(isVisible: Boolean) {
super.onVisibilityAggregated(isVisible)
if (isVisible) {
ticker.run()
} else {
removeCallbacks(ticker)
}
}

override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
removeCallbacks(ticker)
}

private fun updateView() {
val current = System.currentTimeMillis()
val begin = timeStateData.begin
val end = timeStateData.end
val endNotify = timeStateData.endNotify

val timeStateTextView: TextView = binding.timeState

if (current < begin) {
val formattedWaitingTime = formatMillisToTime(begin - current)
val waitingText = context.getString(R.string.room_class_time_waiting_format, formattedWaitingTime)

timeStateTextView.text = waitingText
timeStateTextView.setTextColorRes(R.color.flat_gray)
} else if (current < end) {
val leftTime = end - current

val timeText = if (leftTime <= endNotify) {
context.getString(R.string.room_class_time_left_format, formatMillisToTime(end - current))
} else {
context.getString(R.string.room_class_time_started_format, formatMillisToTime(current - begin))
}

val colorResId = if (leftTime <= endNotify) R.color.flat_yellow else R.color.flat_light_green

timeStateTextView.text = timeText
timeStateTextView.setTextColorRes(colorResId)
} else {
timeStateTextView.text = context.getString(R.string.room_class_time_ended)
}
}

private fun formatMillisToTime(millis: Long): String {
val hours = TimeUnit.MILLISECONDS.toHours(millis)
val minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60
val seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60
return String.format("%02d:%02d:%02d", hours, minutes, seconds)
}

private fun TextView.setTextColorRes(@ColorRes colorResId: Int) {
setTextColor(ContextCompat.getColor(context, colorResId))
}
}
16 changes: 13 additions & 3 deletions app/src/main/res/layout/activity_room_play.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,31 @@
android:layout_height="match_parent"
tools:context="io.agora.flat.ui.activity.play.ClassRoomActivity">

<FrameLayout
android:id="@+id/roomStateContainer"
android:layout_width="0dp"
android:layout_height="36dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<FrameLayout
android:id="@+id/videoListContainer"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/roomStateContainer"
tools:layout_width="@dimen/room_class_video_area_width" />

<FrameLayout
android:id="@+id/whiteboardContainer"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/videoListContainer"
app:layout_constraintTop_toTopOf="parent" />
app:layout_constraintTop_toBottomOf="@id/roomStateContainer" />

<FrameLayout
android:id="@+id/user_windows_container"
Expand Down
29 changes: 29 additions & 0 deletions app/src/main/res/layout/component_room_state.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout_height="36dp">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical">

<Space
android:layout_width="16dp"
android:layout_height="0dp" />

<io.agora.flat.ui.view.TimeStateLayout
android:id="@+id/time_state_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>

<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_gravity="bottom"
android:background="@color/flat_day_night_divider" />
</FrameLayout>
17 changes: 17 additions & 0 deletions app/src/main/res/layout/layout_time_state.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:parentTag="android.widget.FrameLayout">

<TextView
android:id="@+id/time_state"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:maxLines="1"
android:textSize="12sp"
tools:text="@string/room_class_time_waiting_format" />
</merge>
5 changes: 5 additions & 0 deletions app/src/main/res/values-zh/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,11 @@
<string name="record_started_toast">开启录制</string>
<string name="record_stopped_toast">录制完成,可到历史记录查看</string>

<string name="room_class_time_waiting_format">距离上课: %1$s</string>
<string name="room_class_time_started_format">开始上课: %1$s</string>
<string name="room_class_time_left_format">剩余时间: %1$s</string>
<string name="room_class_time_ended">房间已经结束</string>

<string name="cloud_storage">云盘</string>
<string name="cloud_storage_usage_format">已使用 %1$s</string>
<string name="cloud_storage_upload_image">上传照片</string>
Expand Down
2 changes: 1 addition & 1 deletion app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<color name="flat_day_night_text_secondary">@color/flat_gray_3</color>
<color name="flat_day_night_background">@color/flat_white</color>
<color name="flat_day_night_surface">@color/flat_white</color>
<color name="flat_day_night_divider">@color/flat_gray_2</color>
<color name="flat_day_night_divider">@color/flat_gray_1</color>
<color name="flat_day_night_primary_blue">@color/flat_blue_6</color>

<color name="class_room_panel_title">@color/flat_blue_12</color>
Expand Down
5 changes: 5 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -237,6 +237,11 @@
<string name="record_started_toast">Record Started</string>
<string name="record_stopped_toast">Record Stopped</string>

<string name="room_class_time_waiting_format">Waiting: %1$s</string>
<string name="room_class_time_started_format">Started: %1$s</string>
<string name="room_class_time_left_format">Time Left: %1$s</string>
<string name="room_class_time_ended">Ended</string>

<string name="cloud_storage">Cloud Storage</string>
<string name="cloud_storage_usage_format">%1$s used</string>
<string name="cloud_storage_upload_image">Photos</string>
Expand Down

0 comments on commit df384ba

Please sign in to comment.