minor form check/hints

This commit is contained in:
Gary Wang 2021-12-03 14:04:24 +08:00
parent d19fd84244
commit 482f664f7e
2 changed files with 33 additions and 0 deletions

View File

@ -1,8 +1,10 @@
package net.blumia.pcmdroid.ui.screen.addserver package net.blumia.pcmdroid.ui.screen.addserver
import android.webkit.URLUtil
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.text.KeyboardOptions
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.* import androidx.compose.material.*
@ -14,8 +16,11 @@ import androidx.compose.runtime.*
import androidx.compose.runtime.livedata.observeAsState import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.text.input.ImeAction
import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.KeyboardType
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
@ -23,6 +28,7 @@ import androidx.compose.ui.unit.dp
import net.blumia.pcmdroid.model.Server import net.blumia.pcmdroid.model.Server
import net.blumia.pcmdroid.viewmodel.AddServerViewModel import net.blumia.pcmdroid.viewmodel.AddServerViewModel
@OptIn(ExperimentalComposeUiApi::class)
@Composable @Composable
fun StepEnterApiUrl( fun StepEnterApiUrl(
viewModel: AddServerViewModel = AddServerViewModel(), viewModel: AddServerViewModel = AddServerViewModel(),
@ -55,16 +61,25 @@ fun StepEnterApiUrl(
val urlStr: String by viewModel.apiUrl.observeAsState("") val urlStr: String by viewModel.apiUrl.observeAsState("")
val keyboardController = LocalSoftwareKeyboardController.current
OutlinedTextField( OutlinedTextField(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
keyboardOptions = KeyboardOptions( keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Uri, keyboardType = KeyboardType.Uri,
imeAction = ImeAction.Done,
),
keyboardActions = KeyboardActions(
onDone = {
keyboardController?.hide()
}
), ),
singleLine = true, singleLine = true,
value = urlStr, value = urlStr,
onValueChange = viewModel::setApiUrl, onValueChange = viewModel::setApiUrl,
isError = !viewModel.isApiUrlValid() && urlStr.isNotEmpty(),
label = { Text("Server API Url") }, label = { Text("Server API Url") },
) )
} }
@ -91,6 +106,7 @@ fun StepOtherDetail(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
singleLine = true,
value = shortNameStr, value = shortNameStr,
onValueChange = viewModel::setShortNameStr, onValueChange = viewModel::setShortNameStr,
label = { Text("Server short name") }, label = { Text("Server short name") },
@ -100,6 +116,7 @@ fun StepOtherDetail(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
singleLine = true,
value = nameStr, value = nameStr,
onValueChange = viewModel::setNameStr, onValueChange = viewModel::setNameStr,
label = { Text("Server name") }, label = { Text("Server name") },
@ -109,6 +126,7 @@ fun StepOtherDetail(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
singleLine = true,
value = baseFolderNameStr, value = baseFolderNameStr,
onValueChange = viewModel::setBaseFolderNameStr, onValueChange = viewModel::setBaseFolderNameStr,
label = { Text("Base folder name") }, label = { Text("Base folder name") },
@ -118,6 +136,11 @@ fun StepOtherDetail(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Uri,
imeAction = ImeAction.Next,
),
singleLine = true,
value = mediaBaseUrlStr, value = mediaBaseUrlStr,
onValueChange = viewModel::setMediaBaseUrlStr, onValueChange = viewModel::setMediaBaseUrlStr,
label = { Text("Media base url") }, label = { Text("Media base url") },
@ -208,7 +231,9 @@ fun AddServerScreen(
) { ) {
Text("Back") Text("Back")
} }
val apiUrl by viewModel.apiUrl.observeAsState()
Button( Button(
enabled = URLUtil.isNetworkUrl(apiUrl),
onClick = { onClick = {
if (stepState != finalStep) { if (stepState != finalStep) {
viewModel.fetchContentFromApiUrl() viewModel.fetchContentFromApiUrl()

View File

@ -84,6 +84,7 @@ fun EditServerScreen(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
singleLine = true,
value = shortNameStr, value = shortNameStr,
onValueChange = { value -> shortNameStr = value}, onValueChange = { value -> shortNameStr = value},
label = { Text("Server Short Name") }, label = { Text("Server Short Name") },
@ -93,6 +94,7 @@ fun EditServerScreen(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
singleLine = true,
value = nameStr, value = nameStr,
onValueChange = { value -> nameStr = value}, onValueChange = { value -> nameStr = value},
label = { Text("Server Name") }, label = { Text("Server Name") },
@ -105,6 +107,7 @@ fun EditServerScreen(
keyboardOptions = KeyboardOptions( keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Uri, keyboardType = KeyboardType.Uri,
), ),
singleLine = true,
value = urlStr, value = urlStr,
onValueChange = { value -> urlStr = value}, onValueChange = { value -> urlStr = value},
label = { Text("Server API Url") }, label = { Text("Server API Url") },
@ -114,6 +117,7 @@ fun EditServerScreen(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
singleLine = true,
value = baseFolderNameStr, value = baseFolderNameStr,
onValueChange = { value -> baseFolderNameStr = value}, onValueChange = { value -> baseFolderNameStr = value},
label = { Text("Base folder name") }, label = { Text("Base folder name") },
@ -123,6 +127,10 @@ fun EditServerScreen(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 10.dp), .padding(vertical = 10.dp),
keyboardOptions = KeyboardOptions(
keyboardType = KeyboardType.Uri,
),
singleLine = true,
value = mediaBaseUrlStr, value = mediaBaseUrlStr,
onValueChange = { value -> mediaBaseUrlStr = value}, onValueChange = { value -> mediaBaseUrlStr = value},
label = { Text("Media base url") }, label = { Text("Media base url") },