Skip to content

Commit 50fe369

Browse files
committed
메인 화면 compose 임시 적용
1 parent 42d1d7a commit 50fe369

File tree

10 files changed

+262
-236
lines changed

10 files changed

+262
-236
lines changed

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/src/main/java/com/example/webrtc/ComposeActivity.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,20 @@ package com.example.webrtc
22

33
import android.os.Bundle
44
import androidx.activity.compose.setContent
5+
import androidx.activity.viewModels
56
import androidx.appcompat.app.AppCompatActivity
7+
import androidx.hilt.navigation.compose.hiltViewModel
8+
import com.example.presentaion.viewmodel.FireStoreViewModel
9+
import dagger.hilt.android.AndroidEntryPoint
610

7-
class ComposeActivity: AppCompatActivity() {
11+
@AndroidEntryPoint
12+
class ComposeActivity : AppCompatActivity() {
813

14+
private val fireStoreViewModel: FireStoreViewModel by viewModels()
915
override fun onCreate(savedInstanceState: Bundle?) {
1016
super.onCreate(savedInstanceState)
11-
setContent{
12-
WebRTCApp()
17+
setContent {
18+
WebRTCApp(fireStoreViewModel = fireStoreViewModel)
1319
}
1420
}
1521
}

app/src/main/java/com/example/webrtc/MainActivity.kt

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,7 @@ class MainActivity : AppCompatActivity() {
2828
private fun init() = with(binding) {
2929
start.setOnClickListener {
3030
val roomID = roomID.text.toString()
31-
db.collection("calls")
32-
.document(roomID)
33-
.get()
34-
.addOnSuccessListener {
35-
if (it["type"] == "OFFER" || it["type"] == "ANSWER" || it["type"] == "END_CALL") {
36-
} else {
37-
val intent = Intent(this@MainActivity, WebRTCConnectActivity::class.java)
38-
intent.putExtra("roomID", roomID)
39-
intent.putExtra("isJoin", false)
40-
startActivity(intent)
41-
}
42-
}
31+
getRoomInfo(roomID)
4332
}
4433
join.setOnClickListener {
4534
val roomID = roomID.text.toString()
@@ -50,6 +39,21 @@ class MainActivity : AppCompatActivity() {
5039
}
5140
}
5241

42+
private fun getRoomInfo(roomID: String) {
43+
db.collection("calls")
44+
.document(roomID)
45+
.get()
46+
.addOnSuccessListener {
47+
if (it["type"] == "OFFER" || it["type"] == "ANSWER" || it["type"] == "END_CALL") {
48+
} else {
49+
val intent = Intent(this@MainActivity, WebRTCConnectActivity::class.java)
50+
intent.putExtra("roomID", roomID)
51+
intent.putExtra("isJoin", false)
52+
startActivity(intent)
53+
}
54+
}
55+
}
56+
5357
private fun checkCameraAndAudioPermission() {
5458
Log.e(TAG, "checkPermission")
5559
if (ContextCompat.checkSelfPermission(
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,31 @@
11
package com.example.webrtc
22

33
import androidx.compose.runtime.Composable
4+
import androidx.compose.runtime.collectAsState
45
import androidx.navigation.NavHostController
56
import androidx.navigation.compose.NavHost
67
import androidx.navigation.compose.composable
78
import androidx.navigation.compose.rememberNavController
9+
import com.example.presentaion.Route
810
import com.example.presentaion.view.ConnectScreen
911
import com.example.presentaion.view.HomeScreen
12+
import com.example.presentaion.viewmodel.FireStoreViewModel
1013

1114
@Composable
12-
fun WebRTCApp(navHostController: NavHostController = rememberNavController()) {
15+
fun WebRTCApp(
16+
navHostController: NavHostController = rememberNavController(),
17+
fireStoreViewModel: FireStoreViewModel
18+
) {
1319
NavHost(navController = navHostController, startDestination = Route.HOME.path) {
1420
composable(Route.HOME.path) {
15-
HomeScreen()
21+
HomeScreen(
22+
navController = navHostController,
23+
state = fireStoreViewModel.state.collectAsState(),
24+
onStart = { fireStoreViewModel.getRoomInfo(it, false) },
25+
onJoin = { fireStoreViewModel.getRoomInfo(it, true) })
1626
}
1727
composable(Route.CONNECT.path) {
18-
28+
ConnectScreen()
1929
}
2030
}
2131
}

app/src/main/java/com/example/webrtc/Route.kt renamed to presentaion/src/main/java/com/example/presentaion/Route.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.example.webrtc
1+
package com.example.presentaion
22

33
enum class Route(val path: String) {
44
HOME("home"),
Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,8 @@
11
package com.example.presentaion.view
22

3-
import androidx.compose.foundation.layout.fillMaxSize
43
import androidx.compose.runtime.Composable
5-
import androidx.compose.runtime.MutableState
6-
import androidx.compose.runtime.mutableStateOf
7-
import androidx.compose.runtime.remember
8-
import androidx.compose.ui.viewinterop.AndroidView
9-
import org.webrtc.VideoTrack
104

115
@Composable
12-
fun ConnectScreen(videoTrack: VideoTrack) {
6+
fun ConnectScreen(){
137

14-
}
15-
private fun setupVideo(
16-
trackState: MutableState<VideoTrack?>,
17-
track: VideoTrack,
18-
renderer: VideoTextureViewRenderer
19-
) {
20-
if (trackState.value == track) {
21-
return
22-
}
23-
24-
cleanTrack(renderer, trackState)
25-
26-
trackState.value = track
27-
track.addSink(renderer)
28-
}
29-
30-
private fun cleanTrack(
31-
view: VideoTextureViewRenderer?,
32-
trackState: MutableState<VideoTrack?>
33-
) {
34-
view?.let { trackState.value?.removeSink(it) }
35-
trackState.value = null
368
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.example.presentaion.view
2+
3+
import android.os.Bundle
4+
import android.view.LayoutInflater
5+
import android.view.View
6+
import android.view.ViewGroup
7+
import androidx.fragment.app.Fragment
8+
import androidx.fragment.app.viewModels
9+
import androidx.lifecycle.lifecycleScope
10+
import com.example.domain.event.PeerConnectionEvent
11+
import com.example.domain.event.WebRTCEvent
12+
import com.example.domain.state.UiState
13+
import com.example.presentaion.databinding.FragmentConnectionBinding
14+
import com.example.presentaion.viewmodel.ConnectionViewModel
15+
import dagger.hilt.android.AndroidEntryPoint
16+
import kotlinx.coroutines.launch
17+
18+
@AndroidEntryPoint
19+
class ConnectionFragment : Fragment() {
20+
21+
private val viewModel: ConnectionViewModel by viewModels()
22+
23+
private var _binding: FragmentConnectionBinding? = null
24+
private val binding
25+
get() = checkNotNull(_binding) { "binding was accessed outside of view lifecycle" }
26+
27+
override fun onCreateView(
28+
inflater: LayoutInflater,
29+
container: ViewGroup?,
30+
savedInstanceState: Bundle?
31+
): View {
32+
_binding = FragmentConnectionBinding.inflate(inflater, container, false)
33+
return binding.root
34+
}
35+
36+
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
37+
super.onViewCreated(view, savedInstanceState)
38+
collectConnectionEvent()
39+
collectRTCEvent()
40+
collectState()
41+
}
42+
43+
override fun onDestroyView() {
44+
super.onDestroyView()
45+
_binding = null
46+
}
47+
48+
private fun collectState() {
49+
lifecycleScope.launch {
50+
viewModel.uiState.collect{
51+
when(it){
52+
is UiState.UnInitialized -> viewModel.initRTC()
53+
}
54+
}
55+
}
56+
}
57+
58+
private fun collectRTCEvent() {
59+
lifecycleScope.launch {
60+
viewModel.webRTCEvent.collect {
61+
when (it) {
62+
is WebRTCEvent.Initialize -> {
63+
it.webRTCClient.apply {
64+
initPeerConnectionFactory(requireActivity().application)
65+
initVideoCapture(requireActivity().application)
66+
initSurfaceView(binding.remoteView)
67+
initSurfaceView(binding.localView)
68+
startLocalView(binding.localView)
69+
viewModel.call()
70+
viewModel.connect()
71+
}
72+
}
73+
}
74+
}
75+
}
76+
}
77+
78+
private fun collectConnectionEvent() {
79+
lifecycleScope.launch {
80+
viewModel.peerConnectionEvent.collect {
81+
when (it) {
82+
is PeerConnectionEvent.OnIceCandidate -> {
83+
viewModel.sendIceCandidate(it.data)
84+
viewModel.addCandidate(it.data)
85+
}
86+
87+
is PeerConnectionEvent.OnAddStream -> {
88+
it.data.videoTracks?.get(0)?.addSink(binding.remoteView)
89+
}
90+
}
91+
}
92+
}
93+
}
94+
}
Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,85 @@
11
package com.example.presentaion.view
22

3+
import androidx.compose.foundation.background
4+
import androidx.compose.foundation.layout.Arrangement
5+
import androidx.compose.foundation.layout.Column
6+
import androidx.compose.foundation.layout.Row
7+
import androidx.compose.foundation.layout.fillMaxSize
8+
import androidx.compose.material.Button
9+
import androidx.compose.material.OutlinedTextField
10+
import androidx.compose.material.Text
311
import androidx.compose.runtime.Composable
12+
import androidx.compose.runtime.LaunchedEffect
13+
import androidx.compose.runtime.State
14+
import androidx.compose.runtime.collectAsState
15+
import androidx.compose.runtime.mutableStateOf
16+
import androidx.compose.runtime.rememberCoroutineScope
17+
import androidx.compose.runtime.saveable.rememberSaveable
18+
import androidx.compose.ui.Alignment
19+
import androidx.compose.ui.Modifier
20+
import androidx.compose.ui.graphics.Color
21+
import androidx.navigation.NavHostController
22+
import com.example.domain.state.FireStoreState
23+
import com.example.presentaion.viewmodel.FireStoreViewModel
24+
import kotlinx.coroutines.launch
25+
26+
27+
@Composable
28+
fun HomeScreen(
29+
navController: NavHostController,
30+
state: State<FireStoreState>,
31+
onStart: (String) -> Unit,
32+
onJoin: (String) -> Unit
33+
) {
34+
val roomId = rememberSaveable {
35+
mutableStateOf(String())
36+
}
37+
val scope = rememberCoroutineScope()
38+
when (state.value) {
39+
is FireStoreState.EnterRoom -> {
40+
Text(text = "${(state.value as FireStoreState.EnterRoom).isJoin}")
41+
}
42+
43+
is FireStoreState.RoomAlreadyEnded -> {
44+
Text(text = "${(state.value as FireStoreState.RoomAlreadyEnded)}")
45+
}
46+
47+
is FireStoreState.Idle -> {
48+
Text(text = "${(state.value)}")
49+
}
50+
}
51+
Column(
52+
modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center,
53+
horizontalAlignment = Alignment.CenterHorizontally
54+
) {
55+
SearchBar(roomId) {
56+
roomId.value = it
57+
}
58+
Row {
59+
Button(onClick = {
60+
scope.launch {
61+
onStart(roomId.value)
62+
}
63+
}) {
64+
Text(text = "Start")
65+
}
66+
Button(onClick = {
67+
scope.launch {
68+
onJoin(roomId.value)
69+
}
70+
}) {
71+
Text(text = "Join")
72+
}
73+
}
74+
}
75+
}
476

577
@Composable
6-
fun HomeScreen(){
78+
private fun SearchBar(roomId: State<String>, onValueChange: (String) -> Unit) {
79+
OutlinedTextField(
80+
value = roomId.value,
81+
onValueChange = onValueChange,
82+
modifier = Modifier.background(Color.White)
83+
)
784

885
}

0 commit comments

Comments
 (0)