Skip to content

Commit

Permalink
Adds a progress dialog as provisioning may take a few seconds to comp…
Browse files Browse the repository at this point in the history
…lete.
  • Loading branch information
roshanrajaratnam committed May 15, 2024
1 parent b17d809 commit 7133b6c
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 24 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nordicsemi.android.wifi.provisioner.softap.view

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
Expand All @@ -10,7 +9,6 @@ import androidx.compose.material.icons.outlined.Visibility
import androidx.compose.material.icons.outlined.VisibilityOff
import androidx.compose.material.icons.outlined.Wifi
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
Expand All @@ -22,7 +20,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.PasswordVisualTransformation
Expand All @@ -32,6 +29,7 @@ import androidx.compose.ui.unit.dp
import no.nordicsemi.android.wifi.provisioner.feature.softap.R
import no.nordicsemi.android.wifi.provisioner.softap.Open
import no.nordicsemi.android.wifi.provisioner.softap.PassphraseConfiguration
import no.nordicsemi.android.wifi.provisioner.ui.CircularProgressIndicatorContent


@Composable
Expand Down Expand Up @@ -130,20 +128,4 @@ private fun SoftApConnectorContent(
}
)
}
}

@Composable
fun CircularProgressIndicatorContent(text: String) {
Column(
modifier = Modifier.fillMaxWidth(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
CircularProgressIndicator()
Spacer(modifier = Modifier.size(16.dp))
Text(
text = text,
style = MaterialTheme.typography.bodyMedium
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package no.nordicsemi.android.wifi.provisioner.softap.view

import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Settings
import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import no.nordicsemi.android.wifi.provisioner.feature.softap.R
import no.nordicsemi.android.wifi.provisioner.ui.CircularProgressIndicatorContent


@Composable
internal fun SoftApProvisioningDialog(dismiss: () -> Unit) {

AlertDialog(
onDismissRequest = dismiss,
icon = { Icon(imageVector = Icons.Outlined.Settings, contentDescription = null) },
title = {
Text(
text = stringResource(id = R.string.provisioning),
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
style = MaterialTheme.typography.titleLarge
)
},
text = {
CircularProgressIndicatorContent(
text = stringResource(id = R.string.provisioning_device_rationale)
)
},
dismissButton = {},
confirmButton = {}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ fun SoftApProvisioningScreen() {
val viewModel = hiltViewModel<SoftApProvisioningViewModel>()

val state by viewModel.state.collectAsStateWithLifecycle()
val onEvent: (ProvisioningViewEvent) -> Unit = { viewModel.onEvent(it) }
val onEvent: (ProvisioningViewEvent) -> Unit = viewModel::onEvent
Column {
NordicAppBar(
text = stringResource(id = R.string.label_wifi_provisioner),
Expand Down Expand Up @@ -113,6 +113,12 @@ fun SoftApProvisioningScreen() {
onEvent(OnHidePasswordDialog)
}
}

if(state.showProvisioningDialog){
SoftApProvisioningDialog{
onEvent(OnFinishedEvent)
}
}
}

@Composable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ data class SoftApViewEntity(
override val isConnected: Boolean = true,
val isAuthorized: Boolean = false,
val showSoftApDialog: Boolean = false,
val showProvisioningDialog: Boolean = false,
val isNetworkServiceDiscoveryCompleted: Boolean? = null
) : ViewEntity {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,10 @@ class SoftApProvisioningViewModel @Inject constructor(
@RequiresApi(Build.VERSION_CODES.Q)
fun onEvent(event: ProvisioningViewEvent) {
when (event) {
OnFinishedEvent -> finish()
OnFinishedEvent -> {
_state.value = _state.value.copy(showProvisioningDialog = false)
finish()
}
is OnPasswordSelectedEvent -> onPasswordSelected(event.password)
OnSelectDeviceClickEvent -> provisionNextDevice()
is OnSoftApConnectEvent -> {
Expand Down Expand Up @@ -180,14 +183,21 @@ class SoftApProvisioningViewModel @Inject constructor(
}

private fun provision() {
_state.value = _state.value.copy(showProvisioningDialog = true)
val state = _state.value
val network = state.network ?: return
val handler = CoroutineExceptionHandler { _, throwable ->
// There is always chance that a socket timeout is thrown from the DK during
// provisioning due to timing constraints. In such cases, we can ignore the response
// and assume that the provisioning was successful.
if (throwable is SocketTimeoutException) {
handleResponse(state)
_state.value = state.copy(
device = softApManager.softAp,
provisioningStatus = Resource.createSuccess(
data = WifiConnectionStateDomain.CONNECTED,
),
showProvisioningDialog = false
)
}
}
viewModelScope.launch(Dispatchers.IO + handler) {
Expand Down Expand Up @@ -219,8 +229,9 @@ class SoftApProvisioningViewModel @Inject constructor(
_state.value = state.copy(
device = softApManager.softAp,
provisioningStatus = Resource.createSuccess(
data = WifiConnectionStateDomain.CONNECTED
)
data = WifiConnectionStateDomain.CONNECTED,
),
showProvisioningDialog = false
)
}
}
Expand Down
3 changes: 3 additions & 0 deletions feature/softap/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,8 @@
<string name="section_device">Device status</string>
<string name="section_provisioning">Provisioning data</string>
<string name="section_status">Upload status</string>
<string name="provisioning">Provisioning</string>
<string name="provisioning_device_rationale">Please wait while the device is being provisioned.
This may take around 5-10 seconds to complete.</string>

</resources>
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package no.nordicsemi.android.wifi.provisioner.ui

import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.size
import androidx.compose.material3.CircularProgressIndicator
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp

@Composable
fun CircularProgressIndicatorContent(text: String) {
Column(
modifier = Modifier.fillMaxWidth(),
verticalArrangement = Arrangement.Center,
horizontalAlignment = Alignment.CenterHorizontally
) {
CircularProgressIndicator()
Spacer(modifier = Modifier.size(16.dp))
Text(
text = text,
style = MaterialTheme.typography.bodyMedium
)
}
}

0 comments on commit 7133b6c

Please sign in to comment.