1
1
package com.foke.together.presenter.screen
2
2
3
+ import android.graphics.Bitmap
4
+ import android.graphics.Rect
3
5
import androidx.compose.foundation.clickable
4
6
import androidx.compose.foundation.layout.aspectRatio
5
7
import androidx.compose.foundation.layout.fillMaxSize
8
+ import androidx.compose.material3.LinearProgressIndicator
6
9
import androidx.compose.material3.MaterialTheme
7
10
import androidx.compose.material3.Surface
8
11
import androidx.compose.material3.Text
@@ -14,17 +17,36 @@ import androidx.compose.ui.unit.dp
14
17
import androidx.compose.ui.unit.sp
15
18
import androidx.compose.ui.viewinterop.AndroidView
16
19
import androidx.constraintlayout.compose.ConstraintLayout
20
+ import androidx.constraintlayout.compose.Dimension
17
21
import com.foke.together.presenter.theme.FourCutTogetherTheme
18
22
import com.longdo.mjpegviewer.MjpegView
19
23
import androidx.hilt.navigation.compose.hiltViewModel
24
+ import androidx.lifecycle.Lifecycle
25
+ import androidx.lifecycle.compose.LifecycleEventEffect
20
26
import com.foke.together.presenter.viewmodel.CameraViewModel
27
+ import com.foke.together.util.AppLog
28
+ import com.longdo.mjpegviewer.MjpegViewError
29
+ import com.longdo.mjpegviewer.MjpegViewStateChangeListener
21
30
22
31
@Composable
23
32
fun CameraScreen (
24
33
navigateToShare : () -> Unit ,
25
34
popBackStack : () -> Unit ,
26
35
viewModel : CameraViewModel = hiltViewModel()
27
36
) {
37
+ val TAG = " CameraScreen"
38
+ LifecycleEventEffect (Lifecycle .Event .ON_START ) {
39
+ viewModel.setCaptureTimer { navigateToShare() }
40
+ AppLog .d(TAG , " ON_START" )
41
+ }
42
+ LifecycleEventEffect (Lifecycle .Event .ON_RESUME ) {
43
+ AppLog .d(TAG , " ON_RESUME" )
44
+ viewModel.startCaptureTimer()
45
+ }
46
+ LifecycleEventEffect (Lifecycle .Event .ON_STOP ) {
47
+ viewModel.stopCaptureTimer()
48
+ AppLog .d(TAG , " ON_STOP" )
49
+ }
28
50
ConstraintLayout (
29
51
modifier = Modifier .fillMaxSize()
30
52
) {
@@ -49,7 +71,15 @@ fun CameraScreen(
49
71
// tint = MaterialTheme.colorScheme.primary
50
72
// )
51
73
// }
52
-
74
+ LinearProgressIndicator (
75
+ progress = { viewModel.progressState },
76
+ modifier = Modifier .constrainAs(progress){
77
+ start.linkTo(parent.start, margin = 24 .dp)
78
+ end.linkTo(parent.end, margin = 24 .dp)
79
+ bottom.linkTo(title.top)
80
+ width = Dimension .fillToConstraints
81
+ },
82
+ )
53
83
Text (
54
84
text = " 촬영시 움직이지마세요" ,
55
85
modifier = Modifier .constrainAs(title) {
@@ -62,36 +92,63 @@ fun CameraScreen(
62
92
fontSize = 24 .sp,
63
93
)
64
94
65
- AndroidView (
66
- modifier = Modifier .constrainAs(preview) {
67
- top.linkTo(title.bottom)
68
- start.linkTo(parent.start, margin = 24 .dp)
69
- end.linkTo(parent.end, margin = 24 .dp)
70
- bottom.linkTo(imageCount.top)
71
- }
95
+ val mjpegPreview = AndroidView (
96
+ modifier = Modifier
97
+ .constrainAs(preview) {
98
+ top.linkTo(title.bottom)
99
+ start.linkTo(parent.start, margin = 24 .dp)
100
+ end.linkTo(parent.end, margin = 24 .dp)
101
+ bottom.linkTo(imageCount.top)
102
+ }
72
103
.aspectRatio(1.5f ),
73
104
factory = { context ->
74
105
MjpegView (context).apply {
75
106
mode = MjpegView .MODE_BEST_FIT
76
107
isAdjustHeight = true
77
108
supportPinchZoomAndPan = false
109
+ stateChangeListener = object : MjpegViewStateChangeListener {
110
+ override fun onStreamDownloadStart () {
111
+ AppLog .d(TAG , " onStreamDownloadStart" )
112
+ }
113
+
114
+ override fun onStreamDownloadStop () {
115
+ AppLog .d(TAG , " onStreamDownloadStop" )
116
+ }
117
+
118
+ override fun onServerConnected () {
119
+ AppLog .d(TAG , " onServerConnected" )
120
+ }
121
+
122
+ override fun onMeasurementChanged (rect : Rect ? ) {
123
+ AppLog .d(TAG , " onMeasurementChanged" )
124
+ }
125
+
126
+ override fun onNewFrame (image : Bitmap ? ) {
127
+ AppLog .d(TAG , " onNewFrame" )
128
+ // stream 한장 받을때마다 오는 콜백
129
+ }
130
+
131
+ override fun onError (error : MjpegViewError ? ) {
132
+ AppLog .d(TAG , " onError, ${error.toString()} " )
133
+ }
134
+ }
78
135
// test url
79
136
// TODO : change url in viewmodel
80
- setUrl(" https ://192.168.137. 100:8080/test.mjpg " )
137
+ setUrl(" http ://10.32. 100.37:5000/preview " )
81
138
startStream()
82
139
}
83
140
},
84
141
)
142
+
85
143
Text (
86
- text = " 1 / 4" ,
87
- modifier = Modifier .constrainAs(imageCount) {
88
- top.linkTo(preview.bottom)
89
- start.linkTo(parent.start)
90
- end.linkTo(parent.end)
91
- bottom.linkTo(parent.bottom)
92
- }
93
- // 네비게이션 테스트 코드
94
- .clickable { navigateToShare() },
144
+ text = " ${viewModel.captureCount} / 4" ,
145
+ modifier = Modifier
146
+ .constrainAs(imageCount) {
147
+ top.linkTo(preview.bottom)
148
+ start.linkTo(parent.start)
149
+ end.linkTo(parent.end)
150
+ bottom.linkTo(parent.bottom)
151
+ },
95
152
fontWeight = FontWeight .Bold ,
96
153
fontSize = 24 .sp,
97
154
)
0 commit comments