Skip to content

Commit 8736d2e

Browse files
committed
stack location name vertically.
1 parent 3e6b557 commit 8736d2e

File tree

6 files changed

+76
-21
lines changed

6 files changed

+76
-21
lines changed

mobile/src/main/java/com/windscribe/mobile/ui/common/LocationImage.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ fun LocationImage(connectionViewmodel: ConnectionViewmodel, homeViewmodel: HomeV
6060
val locationBackground =
6161
(connectionState.locationInfo as? LocationInfoState.Success)?.locationInfo?.locationBackground
6262
val resource = locationBackground?.resource ?: com.windscribe.vpn.R.drawable.dummy_flag
63-
val imageDimen = calculateImageDimensions()
63+
val isSingleLineLocationName by connectionViewmodel.isSingleLineLocationName.collectAsState()
64+
val imageDimen = calculateImageDimensions(isSingleLineLocationName)
6465
Box {
6566
AnimatedContent(
6667
targetState = resource,

mobile/src/main/java/com/windscribe/mobile/ui/common/Utils.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@ package com.windscribe.mobile.ui.common
33
import android.content.Context
44
import android.content.Intent
55
import android.net.Uri
6+
import android.text.TextPaint
67
import android.widget.Toast
8+
import androidx.compose.ui.unit.Density
9+
import androidx.compose.ui.unit.sp
710
import com.windscribe.mobile.R
811
import com.windscribe.mobile.ui.serverlist.ServerListItem
912
import com.windscribe.vpn.constants.NetworkKeyConstants
@@ -60,4 +63,13 @@ fun Context.openUrl(path: String) {
6063
} else {
6164
Toast.makeText(this, "No browser found", Toast.LENGTH_SHORT).show()
6265
}
66+
}
67+
68+
fun fitsInOneLine(text: String, fontSizeSp: Float, maxWidthPx: Float, density: Density): Boolean {
69+
val paint = TextPaint().apply {
70+
isAntiAlias = true
71+
textSize = with(density) { fontSizeSp.sp.toPx() }
72+
}
73+
val textWidth = paint.measureText(text)
74+
return textWidth <= maxWidthPx
6375
}

mobile/src/main/java/com/windscribe/mobile/ui/connection/ConnectionViewmodel.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,9 +143,11 @@ abstract class ConnectionViewmodel : ViewModel() {
143143
abstract fun onFavouriteIpClick()
144144
abstract fun setContextMenuState(state: Boolean)
145145
abstract val toastMessage: StateFlow<ToastMessage>
146+
abstract val isSingleLineLocationName: StateFlow<Boolean>
146147
abstract fun clearToast()
147148
abstract fun onProtocolChangeClick()
148149
abstract fun onGoToHandled()
150+
abstract fun setIsSingleLineLocationName(singleLine: Boolean)
149151
}
150152

151153
class ConnectionViewmodelImpl @Inject constructor(
@@ -190,6 +192,8 @@ class ConnectionViewmodelImpl @Inject constructor(
190192
private var networkListener: NetworkInfoListener? = null
191193
private val _aspectRatio = MutableStateFlow(1)
192194
override val aspectRatio: StateFlow<Int> = _aspectRatio
195+
private val _isSingleLineLocationName = MutableStateFlow(true)
196+
override val isSingleLineLocationName: StateFlow<Boolean> = _isSingleLineLocationName
193197
private var mediaPlayer: MediaPlayer? = null
194198
private val logger = LoggerFactory.getLogger("ConnectionViewmodel")
195199

@@ -761,6 +765,12 @@ class ConnectionViewmodelImpl @Inject constructor(
761765
}
762766
}
763767

768+
override fun setIsSingleLineLocationName(singleLine: Boolean) {
769+
viewModelScope.launch {
770+
_isSingleLineLocationName.emit(singleLine)
771+
}
772+
}
773+
764774
override fun onCleared() {
765775
networkInfoManager.removeNetworkInfoListener(networkListener!!)
766776
preferences.removeObserver(preferenceChangeListener!!)

mobile/src/main/java/com/windscribe/mobile/ui/helper/ImageHelper.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,17 @@ fun getHeaderHeight(): Dp {
2222
return getStatusBarHeight() + 60.dp
2323
}
2424
@Composable
25-
fun calculateImageDimensions(): ImageDimensions {
25+
fun calculateImageDimensions(isSingleLineLocationName: Boolean): ImageDimensions {
2626
val config = LocalConfiguration.current
2727
val screenWidthDp = config.screenWidthDp
2828
val screenHeightDp = config.screenHeightDp
29-
3029
val screenWidth = screenWidthDp.dp
3130
val screenHeight = screenHeightDp.dp
32-
33-
val minHeight = 233.dp + getStatusBarHeight()
31+
var minImageHeight = 233.dp
32+
if (!isSingleLineLocationName) {
33+
minImageHeight = 275.dp
34+
}
35+
val minHeight = minImageHeight + getStatusBarHeight()
3436
val maxHeight = screenHeight * 0.45f
3537

3638
// Determine dynamic height

mobile/src/main/java/com/windscribe/mobile/ui/home/HomeScreen.kt

Lines changed: 45 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.windscribe.mobile.ui.home
22

33
import NetworkNameSheet
44
import ServerListScreen
5+
import android.R.attr.maxWidth
56
import android.annotation.SuppressLint
67
import android.util.Log
78
import android.widget.Toast
@@ -58,7 +59,9 @@ import androidx.compose.ui.graphics.ColorFilter
5859
import androidx.compose.ui.graphics.RectangleShape
5960
import androidx.compose.ui.graphics.graphicsLayer
6061
import androidx.compose.ui.layout.ContentScale
62+
import androidx.compose.ui.platform.LocalConfiguration
6163
import androidx.compose.ui.platform.LocalContext
64+
import androidx.compose.ui.platform.LocalDensity
6265
import androidx.compose.ui.res.painterResource
6366
import androidx.compose.ui.res.stringResource
6467
import androidx.compose.ui.text.font.FontWeight
@@ -67,12 +70,14 @@ import androidx.compose.ui.text.style.TextOverflow
6770
import androidx.compose.ui.unit.Dp
6871
import androidx.compose.ui.unit.IntOffset
6972
import androidx.compose.ui.unit.dp
73+
import androidx.compose.ui.unit.sp
7074
import androidx.compose.ui.zIndex
7175
import androidx.navigation.NavController
7276
import com.windscribe.mobile.R
7377
import com.windscribe.mobile.ui.AppStartActivity
7478
import com.windscribe.mobile.ui.common.AppConnectButton
7579
import com.windscribe.mobile.ui.common.LocationImage
80+
import com.windscribe.mobile.ui.common.fitsInOneLine
7681
import com.windscribe.mobile.ui.connection.ConnectionUIState
7782
import com.windscribe.mobile.ui.connection.ConnectionViewmodel
7883
import com.windscribe.mobile.ui.connection.LocationInfoState
@@ -363,21 +368,46 @@ private fun LocationName(connectionViewmodel: ConnectionViewmodel) {
363368
val locationInfo = (state.locationInfo as? LocationInfoState.Success)?.locationInfo
364369
val nodeName = locationInfo?.nodeName ?: ""
365370
val nickname = locationInfo?.nickName ?: ""
366-
Row {
367-
Text(
368-
text = nodeName,
369-
style = font26,
370-
maxLines = 1,
371-
overflow = TextOverflow.Ellipsis,
372-
modifier = Modifier.padding(start = 12.dp)
373-
)
374-
Text(
375-
text = " $nickname",
376-
maxLines = 1,
377-
overflow = TextOverflow.Ellipsis,
378-
style = font26.copy(fontWeight = FontWeight.Normal),
379-
modifier = Modifier.padding(end = 12.dp)
380-
)
371+
val density = LocalDensity.current
372+
val configuration = LocalConfiguration.current
373+
val screenWidthDp = configuration.screenWidthDp
374+
val maxWidthPx = with(density) { screenWidthDp.dp.toPx() }
375+
val isSingleLine = fitsInOneLine("$nodeName $nickname", 26.0f, maxWidthPx, density)
376+
connectionViewmodel.setIsSingleLineLocationName(isSingleLine)
377+
if (isSingleLine) {
378+
Row {
379+
Text(
380+
text = nodeName,
381+
style = font26.copy(textAlign = TextAlign.Start),
382+
maxLines = 1,
383+
overflow = TextOverflow.Ellipsis,
384+
modifier = Modifier.padding(start = 12.dp)
385+
)
386+
Text(
387+
text = " $nickname",
388+
maxLines = 1,
389+
overflow = TextOverflow.Ellipsis,
390+
style = font26.copy(fontWeight = FontWeight.Normal, textAlign = TextAlign.Start),
391+
modifier = Modifier.padding(end = 12.dp)
392+
)
393+
}
394+
} else {
395+
Column {
396+
Text(
397+
text = nodeName,
398+
style = font26.copy(textAlign = TextAlign.Start),
399+
maxLines = 1,
400+
overflow = TextOverflow.Ellipsis,
401+
modifier = Modifier.padding(start = 12.dp, end = 12.dp)
402+
)
403+
Text(
404+
text = nickname,
405+
maxLines = 1,
406+
overflow = TextOverflow.Ellipsis,
407+
style = font26.copy(fontWeight = FontWeight.Normal, textAlign = TextAlign.Start),
408+
modifier = Modifier.padding(start = 12.dp, end = 12.dp)
409+
)
410+
}
381411
}
382412
}
383413

mobile/src/main/java/com/windscribe/mobile/ui/serverlist/ConfigServerList.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ private fun SuccessView(
138138
onRefresh = {
139139
viewModel.refresh(ServerListType.Config)
140140
},
141-
modifier = Modifier.fillMaxSize()
141+
modifier = Modifier.weight(1.0f)
142142
) {
143143
LazyColumn(state = lazyListState, modifier = Modifier.fillMaxSize()) {
144144
items(list, key = { it.id }) { item ->

0 commit comments

Comments
 (0)