@@ -5,16 +5,13 @@ import android.content.Context
55import androidx.compose.foundation.ExperimentalFoundationApi
66import androidx.compose.foundation.Image
77import androidx.compose.foundation.background
8- import androidx.compose.foundation.layout.Arrangement
9- import androidx.compose.foundation.layout.Box
108import androidx.compose.foundation.layout.Column
119import androidx.compose.foundation.layout.Row
1210import androidx.compose.foundation.layout.Spacer
1311import androidx.compose.foundation.layout.fillMaxWidth
1412import androidx.compose.foundation.layout.height
1513import androidx.compose.foundation.layout.padding
1614import androidx.compose.foundation.layout.size
17- import androidx.compose.foundation.layout.wrapContentSize
1815import androidx.compose.foundation.shape.RoundedCornerShape
1916import androidx.compose.foundation.text.ClickableText
2017import androidx.compose.foundation.text.selection.SelectionContainer
@@ -23,39 +20,34 @@ import androidx.compose.material3.Button
2320import androidx.compose.material3.MaterialTheme
2421import androidx.compose.material3.Text
2522import androidx.compose.runtime.Composable
26- import androidx.compose.runtime.LaunchedEffect
2723import androidx.compose.runtime.getValue
2824import androidx.compose.runtime.mutableStateOf
2925import androidx.compose.runtime.remember
3026import androidx.compose.runtime.rememberCoroutineScope
3127import androidx.compose.runtime.setValue
3228import androidx.compose.ui.Alignment
3329import androidx.compose.ui.Modifier
34- import androidx.compose.ui.draw.clip
3530import androidx.compose.ui.graphics.asImageBitmap
3631import androidx.compose.ui.res.stringResource
3732import androidx.compose.ui.text.AnnotatedString
3833import androidx.compose.ui.text.TextStyle
3934import androidx.compose.ui.unit.dp
4035import androidx.compose.ui.unit.sp
4136import com.ismartcoding.lib.channel.Channel
42- import com.ismartcoding.lib.helpers.NetworkHelper
4337import com.ismartcoding.plain.R
4438import com.ismartcoding.plain.TempData
4539import com.ismartcoding.plain.clipboardManager
46- import com.ismartcoding.plain.features.WindowFocusChangedEvent
4740import com.ismartcoding.plain.features.locale.LocaleHelper
4841import com.ismartcoding.plain.helpers.AppHelper
4942import com.ismartcoding.plain.helpers.QrCodeGenerateHelper
5043import com.ismartcoding.plain.preference.HttpPortPreference
5144import com.ismartcoding.plain.preference.HttpsPortPreference
5245import com.ismartcoding.plain.ui.base.HorizontalSpace
53- import com.ismartcoding.plain.ui.base.PDropdownMenu
54- import com.ismartcoding.plain.ui.base.PDropdownMenuItem
5546import com.ismartcoding.plain.ui.base.PIconButton
5647import com.ismartcoding.plain.ui.base.RadioDialog
5748import com.ismartcoding.plain.ui.base.RadioDialogOption
5849import com.ismartcoding.plain.ui.helpers.DialogHelper
50+ import com.ismartcoding.plain.ui.models.MainViewModel
5951import com.ismartcoding.plain.web.HttpServerManager
6052import kotlinx.coroutines.Dispatchers
6153import kotlinx.coroutines.launch
@@ -64,112 +56,73 @@ import kotlinx.coroutines.launch
6456@Composable
6557fun WebAddressBar (
6658 context : Context ,
59+ mainVM : MainViewModel ,
6760 isHttps : Boolean ,
6861) {
6962 val port = if (isHttps) TempData .httpsPort else TempData .httpPort
7063 var portDialogVisible by remember { mutableStateOf(false ) }
7164 var qrCodeDialogVisible by remember { mutableStateOf(false ) }
72- var ip4 = remember { NetworkHelper .getDeviceIP4().ifEmpty { " 127.0.0.1" } }
73- var ip4s = remember { NetworkHelper .getDeviceIP4s().filter { it != ip4 } }
74- val showContextMenu = remember { mutableStateOf(false ) }
75- val defaultUrl = remember { mutableStateOf(" ${if (isHttps) " https" else " http" } ://$ip4 :${port} " ) }
65+ var ip4 = mainVM.ip4
66+ var ip4s = mainVM.ip4s.ifEmpty { listOf (" 127.0.0.1" ) }
7667 val scope = rememberCoroutineScope()
77- val sharedFlow = Channel .sharedFlow
68+ var qrCodeUrl by remember { mutableStateOf( " " ) }
7869
79- LaunchedEffect (sharedFlow) {
80- sharedFlow.collect { event ->
81- when (event) {
82- is WindowFocusChangedEvent -> {
83- if (event.hasFocus) {
84- ip4 = NetworkHelper .getDeviceIP4().ifEmpty { " 127.0.0.1" }
85- ip4s = NetworkHelper .getDeviceIP4s().filter { it != ip4 }
86- defaultUrl.value = " ${if (isHttps) " https" else " http" } ://$ip4 :${port} "
87- }
88- }
89- }
90- }
91- }
92-
93- Row (
70+ Column (
9471 Modifier
9572 .fillMaxWidth()
96- .height(48 .dp)
9773 .background(
9874 color = MaterialTheme .colorScheme.surfaceContainerHighest,
9975 shape = RoundedCornerShape (12 .dp),
100- ),
101- verticalAlignment = Alignment .CenterVertically ,
102- ) {
103- SelectionContainer {
104- ClickableText (
105- text = AnnotatedString (defaultUrl.value),
106- modifier = Modifier .padding(start = 16 .dp),
107- style =
108- TextStyle (
109- color = MaterialTheme .colorScheme.onSurface,
110- fontSize = 18 .sp,
111- ),
112- onClick = {
113- val clip = ClipData .newPlainText(LocaleHelper .getString(R .string.link), defaultUrl.value)
114- clipboardManager.setPrimaryClip(clip)
115- DialogHelper .showTextCopiedMessage(defaultUrl.value)
116- },
11776 )
118- }
119- Spacer (modifier = Modifier .weight(1f ))
120- PIconButton (
121- icon = R .drawable.pen,
122- modifier = Modifier .size(32 .dp),
123- iconSize = 16 .dp,
124- contentDescription = stringResource(id = R .string.edit),
125- tint = MaterialTheme .colorScheme.onSurface,
126- click = {
127- portDialogVisible = true
128- },
129- )
130- PIconButton (
131- icon = R .drawable.qr_code,
132- modifier = Modifier .size(32 .dp),
133- iconSize = 16 .dp,
134- contentDescription = stringResource(id = R .string.qrcode),
135- tint = MaterialTheme .colorScheme.onSurface,
136- click = {
137- qrCodeDialogVisible = true
138- },
139- )
140- if (ip4s.isNotEmpty()) {
141- Box (
142- modifier =
143- Modifier
144- .wrapContentSize(Alignment .TopEnd ),
77+ .padding(vertical = 8 .dp)
78+ ) {
79+ for (ip in ip4s) {
80+ Row (
81+ Modifier .height(40 .dp),
82+ verticalAlignment = Alignment .CenterVertically ,
14583 ) {
84+ val url = " ${if (isHttps) " https" else " http" } ://$ip :${port} "
85+ SelectionContainer {
86+ ClickableText (
87+ text = AnnotatedString (url),
88+ modifier = Modifier .padding(start = 16 .dp),
89+ style =
90+ TextStyle (
91+ color = MaterialTheme .colorScheme.onSurface,
92+ fontSize = 18 .sp,
93+ ),
94+ onClick = {
95+ val clip = ClipData .newPlainText(LocaleHelper .getString(R .string.link), url)
96+ clipboardManager.setPrimaryClip(clip)
97+ DialogHelper .showTextCopiedMessage(url)
98+ },
99+ )
100+ }
101+ Spacer (modifier = Modifier .weight(1f ))
146102 PIconButton (
147- icon = R .drawable.ellipsis_vertical ,
103+ icon = R .drawable.pen ,
148104 modifier = Modifier .size(32 .dp),
149105 iconSize = 16 .dp,
150- contentDescription = stringResource(id = R .string.more ),
151- tint = MaterialTheme .colorScheme.onSurfaceVariant ,
106+ contentDescription = stringResource(id = R .string.edit ),
107+ tint = MaterialTheme .colorScheme.onSurface ,
152108 click = {
153- showContextMenu.value = true
109+ portDialogVisible = true
154110 },
155111 )
156- PDropdownMenu (
157- expanded = showContextMenu.value,
158- onDismissRequest = { showContextMenu.value = false },
159- ) {
160- ip4s.forEach { ip ->
161- val url = " ${if (isHttps) " https" else " http" } ://$ip :${port} "
162- PDropdownMenuItem (text = { Text (url) }, onClick = {
163- showContextMenu.value = false
164- val clip = ClipData .newPlainText(LocaleHelper .getString(R .string.link), url)
165- clipboardManager.setPrimaryClip(clip)
166- DialogHelper .showTextCopiedMessage(url)
167- })
168- }
169- }
112+ PIconButton (
113+ icon = R .drawable.qr_code,
114+ modifier = Modifier .size(32 .dp),
115+ iconSize = 16 .dp,
116+ contentDescription = stringResource(id = R .string.qrcode),
117+ tint = MaterialTheme .colorScheme.onSurface,
118+ click = {
119+ qrCodeUrl = url
120+ qrCodeDialogVisible = true
121+ },
122+ )
123+ HorizontalSpace (dp = 4 .dp)
170124 }
171125 }
172- HorizontalSpace (dp = 4 .dp)
173126 }
174127
175128 if (portDialogVisible) {
@@ -203,7 +156,6 @@ fun WebAddressBar(
203156 portDialogVisible = false
204157 }
205158 }
206-
207159 if (qrCodeDialogVisible) {
208160 AlertDialog (
209161 containerColor = MaterialTheme .colorScheme.surface,
@@ -230,7 +182,7 @@ fun WebAddressBar(
230182 color = MaterialTheme .colorScheme.onSurface,
231183 )
232184 Image (
233- bitmap = QrCodeGenerateHelper .generate(defaultUrl.value , 300 , 300 ).asImageBitmap(),
185+ bitmap = QrCodeGenerateHelper .generate(qrCodeUrl , 300 , 300 ).asImageBitmap(),
234186 contentDescription = stringResource(id = R .string.qrcode),
235187 modifier = Modifier
236188 .size(300 .dp)
0 commit comments