Skip to content

Commit

Permalink
Expose host info to host (#198)
Browse files Browse the repository at this point in the history
  • Loading branch information
micbakos-rdx committed Aug 14, 2024
1 parent ecd2466 commit cde0859
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 33 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "sargon"
version = "1.1.4"
version = "1.1.5"
edition = "2021"
build = "build.rs"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ package com.radixdlt.sargon.android
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row
Expand All @@ -15,6 +16,7 @@ import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Switch
Expand All @@ -23,6 +25,9 @@ import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
Expand All @@ -40,6 +45,10 @@ import com.radixdlt.sargon.extensions.errorCode
import com.radixdlt.sargon.extensions.errorMessage
import com.radixdlt.sargon.extensions.isMain
import com.radixdlt.sargon.extensions.kind
import com.radixdlt.sargon.extensions.name
import com.radixdlt.sargon.extensions.string
import com.radixdlt.sargon.extensions.vendor
import com.radixdlt.sargon.extensions.version
import com.radixdlt.sargon.os.driver.BiometricsHandler
import com.radixdlt.sargon.samples.sample
import dagger.hilt.android.AndroidEntryPoint
Expand Down Expand Up @@ -106,33 +115,82 @@ fun WalletContent(
}
}
) { padding ->
when (val profileState = state.profileState) {
is ProfileState.None -> NoProfileContent(
modifier = Modifier
.padding(padding)
.padding(16.dp),
onCreateNewWallet = viewModel::onCreateNewWallet,
onImportWallet = {
viewModel.onImportWallet(Profile.sample())
Column(modifier = Modifier.padding(padding)) {
state.info?.let { info ->
var isHostInfoVisible by remember {
mutableStateOf(false)
}
)

is ProfileState.Incompatible -> IncompatibleProfile(
modifier = Modifier
.padding(padding)
.padding(16.dp),
error = profileState.v1
)
TextButton(
onClick = { isHostInfoVisible = !isHostInfoVisible }
) {
Text(text = "Host information (ℹ)")
}

is ProfileState.Loaded -> ProfileContent(
modifier = Modifier
.padding(padding)
.padding(16.dp),
profile = profileState.v1,
onDevModeChanged = { enabled ->
viewModel.onDevModeChanged(enabled)
AnimatedVisibility(visible = isHostInfoVisible) {
Column(modifier = Modifier.padding(horizontal = 16.dp)) {
Text(
text = "Host ID",
style = MaterialTheme.typography.titleMedium
)
Text(
text = "\t${info.id.id}"
)

Text(
text = "Host description",
style = MaterialTheme.typography.titleMedium
)
Text(
text = "\t${info.info.description.string}"
)

Text(
text = "Host OS",
style = MaterialTheme.typography.titleMedium
)
Text(
text = "\t${info.info.hostOs.name} - ${info.info.hostOs.vendor} - ${info.info.hostOs.version}"
)

Text(
text = "App Version",
style = MaterialTheme.typography.titleMedium
)
Text(
text = "\t${info.info.hostAppVersion}"
)
}
}
)

HorizontalDivider()
}

when (val profileState = state.profileState) {
is ProfileState.None -> NoProfileContent(
modifier = Modifier
.padding(16.dp),
onCreateNewWallet = viewModel::onCreateNewWallet,
onImportWallet = {
viewModel.onImportWallet(Profile.sample())
}
)

is ProfileState.Incompatible -> IncompatibleProfile(
modifier = Modifier
.padding(16.dp),
error = profileState.v1
)

is ProfileState.Loaded -> ProfileContent(
modifier = Modifier
.padding(16.dp),
profile = profileState.v1,
onDevModeChanged = { enabled ->
viewModel.onDevModeChanged(enabled)
}
)
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,17 @@ package com.radixdlt.sargon.android
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.radixdlt.sargon.Account
import com.radixdlt.sargon.DisplayName
import com.radixdlt.sargon.NetworkId
import com.radixdlt.sargon.OnLedgerSettings
import com.radixdlt.sargon.HostId
import com.radixdlt.sargon.HostInfo
import com.radixdlt.sargon.Profile
import com.radixdlt.sargon.ProfileNetwork
import com.radixdlt.sargon.ProfileState
import com.radixdlt.sargon.Timestamp
import com.radixdlt.sargon.extensions.asIdentifiable
import com.radixdlt.sargon.extensions.default
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
Expand All @@ -29,12 +26,25 @@ class MainViewModel @Inject constructor(

val state = combine(
sargonOsManager.sargonState,
sargonOsManager.profileState
sargonOsManager.profileState,
) { sargonState, profileState ->
State(
sargonState,
profileState
)
}.map { state ->
if (state.info == null) {
val osState = state.sargonState as? SargonOsManager.SargonState.Booted ?: return@map state

state.copy(
info = HostInformation(
id = osState.os.resolveHostId(),
info = osState.os.resolveHostInfo()
)
)
} else {
state
}
}.stateIn(
scope = viewModelScope,
started = SharingStarted.Eagerly,
Expand Down Expand Up @@ -100,7 +110,13 @@ class MainViewModel @Inject constructor(
data class State(
val sargonState: SargonOsManager.SargonState = SargonOsManager.SargonState.Idle,
val profileState: ProfileState = ProfileState.None,
val accounts: List<Account> = emptyList()
val accounts: List<Account> = emptyList(),
val info: HostInformation? = null
)

data class HostInformation(
val id: HostId,
val info: HostInfo
)

}
25 changes: 25 additions & 0 deletions src/system/sargon_os/sargon_os.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,14 @@ impl SargonOS {
.await;
Ok(())
}

pub async fn resolve_host_id(&self) -> Result<HostId> {
self.host_id().await
}

pub async fn resolve_host_info(&self) -> HostInfo {
self.host_info().await
}
}

impl SargonOS {
Expand Down Expand Up @@ -421,4 +429,21 @@ mod tests {
.await
.is_err());
}

#[actix_rt::test]
async fn test_resolve_host_id() {
let os = SUT::fast_boot().await;

assert_eq!(
os.resolve_host_id().await.unwrap(),
os.host_id().await.unwrap()
)
}

#[actix_rt::test]
async fn test_resolve_host_info() {
let os = SUT::fast_boot().await;

assert_eq!(os.resolve_host_info().await, os.host_info().await)
}
}

0 comments on commit cde0859

Please sign in to comment.