diff --git a/androidApp/src/main/kotlin/com/kgurgul/cpuinfo/tv/features/information/cpu/TvCpuInfoScreen.kt b/androidApp/src/main/kotlin/com/kgurgul/cpuinfo/tv/features/information/cpu/TvCpuInfoScreen.kt index 0945339a..76035686 100644 --- a/androidApp/src/main/kotlin/com/kgurgul/cpuinfo/tv/features/information/cpu/TvCpuInfoScreen.kt +++ b/androidApp/src/main/kotlin/com/kgurgul/cpuinfo/tv/features/information/cpu/TvCpuInfoScreen.kt @@ -15,33 +15,26 @@ */ package com.kgurgul.cpuinfo.tv.features.information.cpu +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kgurgul.cpuinfo.domain.model.CpuData +import com.kgurgul.cpuinfo.domain.model.getName +import com.kgurgul.cpuinfo.domain.model.getValue +import com.kgurgul.cpuinfo.features.information.base.InformationRow import com.kgurgul.cpuinfo.features.information.cpu.CpuInfoViewModel import com.kgurgul.cpuinfo.shared.Res -import com.kgurgul.cpuinfo.shared.cpu_abi -import com.kgurgul.cpuinfo.shared.cpu_cores import com.kgurgul.cpuinfo.shared.cpu_current_frequency import com.kgurgul.cpuinfo.shared.cpu_frequency_stopped -import com.kgurgul.cpuinfo.shared.cpu_has_neon -import com.kgurgul.cpuinfo.shared.cpu_l1d -import com.kgurgul.cpuinfo.shared.cpu_l1i -import com.kgurgul.cpuinfo.shared.cpu_l2 -import com.kgurgul.cpuinfo.shared.cpu_l3 -import com.kgurgul.cpuinfo.shared.cpu_l4 -import com.kgurgul.cpuinfo.shared.cpu_soc_name -import com.kgurgul.cpuinfo.shared.no -import com.kgurgul.cpuinfo.shared.yes import com.kgurgul.cpuinfo.tv.ui.components.TvListItem import com.kgurgul.cpuinfo.ui.components.CpuProgressBar -import com.kgurgul.cpuinfo.ui.components.ItemValueRow import com.kgurgul.cpuinfo.ui.theme.spacingSmall import com.kgurgul.cpuinfo.utils.formatHz import org.jetbrains.compose.resources.stringResource @@ -57,6 +50,7 @@ fun TvCpuInfoScreen(viewModel: CpuInfoViewModel = koinViewModel()) { fun TvCpuInfoScreen(uiState: CpuInfoViewModel.UiState) { LazyColumn( contentPadding = PaddingValues(spacingSmall), + verticalArrangement = Arrangement.spacedBy(spacingSmall), modifier = Modifier.fillMaxSize().testTag(TvCpuInfoScreenTestTags.LAZY_COLUMN), ) { uiState.cpuData?.let { cpuData -> @@ -65,91 +59,15 @@ fun TvCpuInfoScreen(uiState: CpuInfoViewModel.UiState) { TvListItem { FrequencyItem(index = i, frequency = frequency) } } } - item(key = "__soc_name") { + items(cpuData.cpuItems) { itemValue -> TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_soc_name), - value = cpuData.processorName, - modifier = Modifier.testTag(TvCpuInfoScreenTestTags.SOCKET_NAME), + InformationRow( + title = itemValue.getName(), + value = itemValue.getValue(), + isLastItem = true, ) } } - item(key = "__abi") { - TvListItem { - ItemValueRow(title = stringResource(Res.string.cpu_abi), value = cpuData.abi) - } - } - item(key = "__cores") { - TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_cores), - value = cpuData.coreNumber.toString(), - ) - } - } - item(key = "__has_neon") { - TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_has_neon), - value = - if (cpuData.hasArmNeon) { - stringResource(Res.string.yes) - } else { - stringResource(Res.string.no) - }, - ) - } - } - if (cpuData.l1dCaches.isNotEmpty()) { - item(key = "__l1d") { - TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_l1d), - value = cpuData.l1dCaches, - ) - } - } - } - if (cpuData.l1iCaches.isNotEmpty()) { - item(key = "__l1i") { - TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_l1i), - value = cpuData.l1iCaches, - ) - } - } - } - if (cpuData.l2Caches.isNotEmpty()) { - item(key = "__l2") { - TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_l2), - value = cpuData.l2Caches, - ) - } - } - } - if (cpuData.l3Caches.isNotEmpty()) { - item(key = "__l3") { - TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_l3), - value = cpuData.l3Caches, - ) - } - } - } - if (cpuData.l4Caches.isNotEmpty()) { - item(key = "__l4") { - TvListItem { - ItemValueRow( - title = stringResource(Res.string.cpu_l4), - value = cpuData.l4Caches, - ) - } - } - } } } } diff --git a/shared/src/androidMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.android.kt b/shared/src/androidMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.android.kt index bd4a1fb6..5b730775 100644 --- a/shared/src/androidMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.android.kt +++ b/shared/src/androidMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.android.kt @@ -15,13 +15,19 @@ */ package com.kgurgul.cpuinfo.data.provider +import com.kgurgul.cpuinfo.domain.model.ItemValue +import com.kgurgul.cpuinfo.shared.Res +import com.kgurgul.cpuinfo.shared.cpu_has_neon +import com.kgurgul.cpuinfo.shared.no +import com.kgurgul.cpuinfo.shared.yes + actual class CpuDataNativeProvider actual constructor() : ICpuDataNativeProvider { actual external override fun initLibrary() actual external override fun getCpuName(): String - actual external override fun hasArmNeon(): Boolean + private external fun hasArmNeon(): Boolean actual external override fun getL1dCaches(): IntArray? @@ -34,4 +40,11 @@ actual class CpuDataNativeProvider actual constructor() : ICpuDataNativeProvider actual external override fun getL4Caches(): IntArray? actual external override fun getNumberOfCores(): Int + + override fun getExtraItems(): List = listOf( + ItemValue.NameValueResource( + name = Res.string.cpu_has_neon, + value = if (hasArmNeon()) Res.string.yes else Res.string.no, + ), + ) } diff --git a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.kt b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.kt index 71c3df2a..328a4197 100644 --- a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.kt +++ b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.kt @@ -21,8 +21,6 @@ expect class CpuDataNativeProvider() : ICpuDataNativeProvider { override fun getCpuName(): String - override fun hasArmNeon(): Boolean - override fun getL1dCaches(): IntArray? override fun getL1iCaches(): IntArray? diff --git a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/ICpuDataNativeProvider.kt b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/ICpuDataNativeProvider.kt index fd68d06e..2ebe370a 100644 --- a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/ICpuDataNativeProvider.kt +++ b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/data/provider/ICpuDataNativeProvider.kt @@ -15,14 +15,14 @@ */ package com.kgurgul.cpuinfo.data.provider +import com.kgurgul.cpuinfo.domain.model.ItemValue + interface ICpuDataNativeProvider { fun initLibrary() fun getCpuName(): String - fun hasArmNeon(): Boolean - fun getL1dCaches(): IntArray? fun getL1iCaches(): IntArray? @@ -34,4 +34,6 @@ interface ICpuDataNativeProvider { fun getL4Caches(): IntArray? fun getNumberOfCores(): Int + + fun getExtraItems(): List = emptyList() } diff --git a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/model/CpuData.kt b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/model/CpuData.kt index 0c786f6b..2a54349b 100644 --- a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/model/CpuData.kt +++ b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/model/CpuData.kt @@ -19,16 +19,8 @@ import androidx.compose.runtime.Stable @Stable data class CpuData( - val processorName: String, - val abi: String, - val coreNumber: Int, - val hasArmNeon: Boolean, + val cpuItems: List, val frequencies: List, - val l1dCaches: String, - val l1iCaches: String, - val l2Caches: String, - val l3Caches: String, - val l4Caches: String, ) { data class Frequency(val min: Long, val max: Long, val current: Long) diff --git a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/observable/CpuDataObservable.kt b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/observable/CpuDataObservable.kt index a2707b74..33df6e02 100644 --- a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/observable/CpuDataObservable.kt +++ b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/domain/observable/CpuDataObservable.kt @@ -19,6 +19,16 @@ import com.kgurgul.cpuinfo.data.provider.ICpuDataNativeProvider import com.kgurgul.cpuinfo.data.provider.ICpuDataProvider import com.kgurgul.cpuinfo.domain.ImmutableInteractor import com.kgurgul.cpuinfo.domain.model.CpuData +import com.kgurgul.cpuinfo.domain.model.ItemValue +import com.kgurgul.cpuinfo.shared.Res +import com.kgurgul.cpuinfo.shared.cpu_abi +import com.kgurgul.cpuinfo.shared.cpu_cores +import com.kgurgul.cpuinfo.shared.cpu_l1d +import com.kgurgul.cpuinfo.shared.cpu_l1i +import com.kgurgul.cpuinfo.shared.cpu_l2 +import com.kgurgul.cpuinfo.shared.cpu_l3 +import com.kgurgul.cpuinfo.shared.cpu_l4 +import com.kgurgul.cpuinfo.shared.cpu_soc_name import com.kgurgul.cpuinfo.utils.IDispatchersProvider import com.kgurgul.cpuinfo.utils.Utils import kotlinx.coroutines.delay @@ -38,7 +48,6 @@ class CpuDataObservable( val abi = cpuDataProvider.getAbi() val logicalCoresCount = cpuDataProvider.getNumberOfLogicalCores() val physicalCoresCount = cpuDataProvider.getNumberOfPhysicalCores() - val hasArmNeon = cpuDataNativeProvider.hasArmNeon() val frequencies = mutableListOf() val l1dCaches = cpuDataNativeProvider.getL1dCaches()?.joinToString(separator = "\n") { @@ -67,18 +76,31 @@ class CpuDataObservable( frequencies.add(CpuData.Frequency(min, max, current)) } } + val cpuItems = buildList { + add(ItemValue.NameResource(Res.string.cpu_soc_name, processorName)) + add(ItemValue.NameResource(Res.string.cpu_abi, abi)) + add(ItemValue.NameResource(Res.string.cpu_cores, physicalCoresCount.toString())) + addAll(cpuDataNativeProvider.getExtraItems()) + if (l1dCaches.isNotEmpty()) { + add(ItemValue.NameResource(Res.string.cpu_l1d, l1dCaches)) + } + if (l1iCaches.isNotEmpty()) { + add(ItemValue.NameResource(Res.string.cpu_l1i, l1iCaches)) + } + if (l2Caches.isNotEmpty()) { + add(ItemValue.NameResource(Res.string.cpu_l2, l2Caches)) + } + if (l3Caches.isNotEmpty()) { + add(ItemValue.NameResource(Res.string.cpu_l3, l3Caches)) + } + if (l4Caches.isNotEmpty()) { + add(ItemValue.NameResource(Res.string.cpu_l4, l4Caches)) + } + } emit( CpuData( - processorName = processorName, - abi = abi, - coreNumber = physicalCoresCount, - hasArmNeon = hasArmNeon, + cpuItems = cpuItems, frequencies = frequencies, - l1dCaches = l1dCaches, - l1iCaches = l1iCaches, - l2Caches = l2Caches, - l3Caches = l3Caches, - l4Caches = l4Caches, ) ) delay(REFRESH_DELAY) diff --git a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/features/information/cpu/CpuInfoScreen.kt b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/features/information/cpu/CpuInfoScreen.kt index c43ece17..2a05e1a2 100644 --- a/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/features/information/cpu/CpuInfoScreen.kt +++ b/shared/src/commonMain/kotlin/com/kgurgul/cpuinfo/features/information/cpu/CpuInfoScreen.kt @@ -17,11 +17,10 @@ package com.kgurgul.cpuinfo.features.information.cpu import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.requiredSize import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue @@ -31,24 +30,17 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.kgurgul.cpuinfo.domain.model.CpuData +import com.kgurgul.cpuinfo.domain.model.ItemValue +import com.kgurgul.cpuinfo.domain.model.getKey +import com.kgurgul.cpuinfo.domain.model.getName +import com.kgurgul.cpuinfo.domain.model.getValue +import com.kgurgul.cpuinfo.features.information.base.InformationRow import com.kgurgul.cpuinfo.shared.Res -import com.kgurgul.cpuinfo.shared.cpu_abi -import com.kgurgul.cpuinfo.shared.cpu_cores import com.kgurgul.cpuinfo.shared.cpu_current_frequency import com.kgurgul.cpuinfo.shared.cpu_frequency_stopped -import com.kgurgul.cpuinfo.shared.cpu_has_neon -import com.kgurgul.cpuinfo.shared.cpu_l1d -import com.kgurgul.cpuinfo.shared.cpu_l1i -import com.kgurgul.cpuinfo.shared.cpu_l2 -import com.kgurgul.cpuinfo.shared.cpu_l3 -import com.kgurgul.cpuinfo.shared.cpu_l4 import com.kgurgul.cpuinfo.shared.cpu_soc_name -import com.kgurgul.cpuinfo.shared.no -import com.kgurgul.cpuinfo.shared.yes -import com.kgurgul.cpuinfo.ui.components.CpuDivider import com.kgurgul.cpuinfo.ui.components.CpuProgressBar import com.kgurgul.cpuinfo.ui.components.CpuPullToRefreshBox -import com.kgurgul.cpuinfo.ui.components.ItemValueRow import com.kgurgul.cpuinfo.ui.components.VerticalScrollbar import com.kgurgul.cpuinfo.ui.theme.CpuInfoTheme import com.kgurgul.cpuinfo.ui.theme.spacingSmall @@ -78,95 +70,19 @@ fun CpuInfoScreen(uiState: CpuInfoViewModel.UiState) { modifier = Modifier.fillMaxSize().testTag(CpuInfoScreenTestTags.LAZY_COLUMN), ) { uiState.cpuData?.let { cpuData -> - item(key = "__soc_name") { - ItemValueRow( - title = stringResource(Res.string.cpu_soc_name), - value = cpuData.processorName, - modifier = Modifier.testTag(CpuInfoScreenTestTags.SOCKET_NAME), + itemsIndexed( + cpuData.cpuItems, + key = { _, item -> item.getKey() }, + ) { index, itemValue -> + InformationRow( + title = itemValue.getName(), + value = itemValue.getValue(), + isLastItem = index == cpuData.cpuItems.lastIndex + && cpuData.frequencies.isEmpty(), ) - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - CpuDivider() - } - item(key = "__abi") { - ItemValueRow(title = stringResource(Res.string.cpu_abi), value = cpuData.abi) - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - CpuDivider() - } - item(key = "__cores") { - ItemValueRow( - title = stringResource(Res.string.cpu_cores), - value = cpuData.coreNumber.toString(), - ) - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - CpuDivider() - } - item(key = "__has_neon") { - ItemValueRow( - title = stringResource(Res.string.cpu_has_neon), - value = - if (cpuData.hasArmNeon) { - stringResource(Res.string.yes) - } else { - stringResource(Res.string.no) - }, - ) - } - if (cpuData.l1dCaches.isNotEmpty()) { - item(key = "__l1d") { - CpuDivider() - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - ItemValueRow( - title = stringResource(Res.string.cpu_l1d), - value = cpuData.l1dCaches, - ) - } - } - if (cpuData.l1iCaches.isNotEmpty()) { - item(key = "__l1i") { - CpuDivider() - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - ItemValueRow( - title = stringResource(Res.string.cpu_l1i), - value = cpuData.l1iCaches, - ) - } - } - if (cpuData.l2Caches.isNotEmpty()) { - item(key = "__l2") { - CpuDivider() - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - ItemValueRow( - title = stringResource(Res.string.cpu_l2), - value = cpuData.l2Caches, - ) - } - } - if (cpuData.l3Caches.isNotEmpty()) { - item(key = "__l3") { - CpuDivider() - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - ItemValueRow( - title = stringResource(Res.string.cpu_l3), - value = cpuData.l3Caches, - ) - } - } - if (cpuData.l4Caches.isNotEmpty()) { - item(key = "__l4") { - CpuDivider() - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - ItemValueRow( - title = stringResource(Res.string.cpu_l4), - value = cpuData.l4Caches, - ) - } } cpuData.frequencies.forEachIndexed { i, frequency -> item(key = "__frequency_$i") { - if (i == 0) { - CpuDivider() - Spacer(modifier = Modifier.requiredSize(spacingSmall)) - } FrequencyItem(index = i, frequency = frequency) } } @@ -222,16 +138,12 @@ fun CpuInfoScreenPreview() { CpuInfoViewModel.UiState( cpuData = CpuData( - processorName = "processorName", - abi = "abi", - coreNumber = 1, - hasArmNeon = true, + cpuItems = listOf( + ItemValue.NameResource(Res.string.cpu_soc_name, "processorName"), + ItemValue.Text("ABI", "abi"), + ItemValue.Text("Cores", "1"), + ), frequencies = listOf(CpuData.Frequency(min = 1, max = 2, current = 3)), - l1dCaches = "l1dCaches", - l1iCaches = "l1iCaches", - l2Caches = "l2Caches", - l3Caches = "l3Caches", - l4Caches = "l4Caches", ) ) ) diff --git a/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/TestData.kt b/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/TestData.kt index 245219cf..9ab7a7a1 100644 --- a/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/TestData.kt +++ b/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/TestData.kt @@ -30,6 +30,9 @@ import com.kgurgul.cpuinfo.domain.model.TextResource import com.kgurgul.cpuinfo.shared.Res import com.kgurgul.cpuinfo.shared.baseline_folder_special_24 import com.kgurgul.cpuinfo.shared.cpu +import com.kgurgul.cpuinfo.shared.cpu_abi +import com.kgurgul.cpuinfo.shared.cpu_cores +import com.kgurgul.cpuinfo.shared.cpu_soc_name import com.kgurgul.cpuinfo.shared.ic_cpu_temp import kotlinx.collections.immutable.persistentListOf @@ -106,16 +109,12 @@ object TestData { val cpuData = CpuData( - processorName = "CPU_NAME", - abi = "x64", - coreNumber = 1, - hasArmNeon = true, + cpuItems = listOf( + ItemValue.NameResource(Res.string.cpu_soc_name, "CPU_NAME"), + ItemValue.NameResource(Res.string.cpu_abi, "x64"), + ItemValue.NameResource(Res.string.cpu_cores, "1"), + ), frequencies = emptyList(), - l1dCaches = "", - l1iCaches = "", - l2Caches = "", - l3Caches = "", - l4Caches = "", ) val ramData = diff --git a/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/provider/FakeCpuDataNativeProvider.kt b/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/provider/FakeCpuDataNativeProvider.kt index 9f64d6f8..67389f1c 100644 --- a/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/provider/FakeCpuDataNativeProvider.kt +++ b/shared/src/commonTest/kotlin/com/kgurgul/cpuinfo/data/provider/FakeCpuDataNativeProvider.kt @@ -23,10 +23,6 @@ class FakeCpuDataNativeProvider : ICpuDataNativeProvider { return "CPU_NAME" } - override fun hasArmNeon(): Boolean { - return true - } - override fun getL1dCaches(): IntArray? { return null } diff --git a/shared/src/desktopMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.jvm.kt b/shared/src/desktopMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.jvm.kt index 152a48f0..810f0d36 100644 --- a/shared/src/desktopMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.jvm.kt +++ b/shared/src/desktopMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.jvm.kt @@ -30,10 +30,6 @@ actual class CpuDataNativeProvider actual constructor() : ICpuDataNativeProvider return processor.processorIdentifier.name } - actual override fun hasArmNeon(): Boolean { - return processor.featureFlags.contains("neon") - } - actual override fun getL1dCaches(): IntArray? { return null } diff --git a/shared/src/desktopTest/kotlin/com/kgurgul/cpuinfo/screen/CpuInfoScreenTest.kt b/shared/src/desktopTest/kotlin/com/kgurgul/cpuinfo/screen/CpuInfoScreenTest.kt index b68b9417..8375f718 100644 --- a/shared/src/desktopTest/kotlin/com/kgurgul/cpuinfo/screen/CpuInfoScreenTest.kt +++ b/shared/src/desktopTest/kotlin/com/kgurgul/cpuinfo/screen/CpuInfoScreenTest.kt @@ -31,11 +31,7 @@ class CpuInfoScreenTest { @Test fun hasItems() = runComposeUiTest { setContent { CpuInfoScreen(uiState = CpuInfoViewModel.UiState(cpuData = TestData.cpuData)) } - listOf( - TestData.cpuData.processorName, - TestData.cpuData.abi, - TestData.cpuData.coreNumber.toString(), - ) - .forEach { tag -> onNodeWithText(tag).performScrollTo().assertIsDisplayed() } + listOf("CPU_NAME", "x64", "1") + .forEach { text -> onNodeWithText(text).performScrollTo().assertIsDisplayed() } } } diff --git a/shared/src/iosMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.ios.kt b/shared/src/iosMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.ios.kt index 2ff3572a..d74ca315 100644 --- a/shared/src/iosMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.ios.kt +++ b/shared/src/iosMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.ios.kt @@ -31,7 +31,6 @@ import libcpuinfo.cpuinfo_get_l3_caches_count import libcpuinfo.cpuinfo_get_l4_caches import libcpuinfo.cpuinfo_get_l4_caches_count import libcpuinfo.cpuinfo_get_package -import libcpuinfo.cpuinfo_has_arm_neon import libcpuinfo.cpuinfo_initialize actual class CpuDataNativeProvider actual constructor() : ICpuDataNativeProvider { @@ -50,13 +49,6 @@ actual class CpuDataNativeProvider actual constructor() : ICpuDataNativeProvider } } - actual override fun hasArmNeon(): Boolean { - if (!cpuinfo_initialize()) { - return false - } - return cpuinfo_has_arm_neon() - } - actual override fun getL1dCaches(): IntArray? { if (!cpuinfo_initialize() || cpuinfo_get_l1d_caches_count() == 0.toUInt()) { return null diff --git a/shared/src/wasmJsMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.wasm.kt b/shared/src/wasmJsMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.wasm.kt index 1ad927d1..d526d997 100644 --- a/shared/src/wasmJsMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.wasm.kt +++ b/shared/src/wasmJsMain/kotlin/com/kgurgul/cpuinfo/data/provider/CpuDataNativeProvider.wasm.kt @@ -23,10 +23,6 @@ actual class CpuDataNativeProvider actual constructor() : ICpuDataNativeProvider return "Unknown" } - actual override fun hasArmNeon(): Boolean { - return false - } - actual override fun getL1dCaches(): IntArray? { return null } diff --git a/wearOsApp/src/main/kotlin/com/kgurgul/cpuinfo/wear/features/information/cpu/WearCpuInfoScreen.kt b/wearOsApp/src/main/kotlin/com/kgurgul/cpuinfo/wear/features/information/cpu/WearCpuInfoScreen.kt index c6deb33f..bc9e97cc 100644 --- a/wearOsApp/src/main/kotlin/com/kgurgul/cpuinfo/wear/features/information/cpu/WearCpuInfoScreen.kt +++ b/wearOsApp/src/main/kotlin/com/kgurgul/cpuinfo/wear/features/information/cpu/WearCpuInfoScreen.kt @@ -20,6 +20,7 @@ package com.kgurgul.cpuinfo.wear.features.information.cpu import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.lifecycle.compose.collectAsStateWithLifecycle +import androidx.wear.compose.foundation.lazy.items import androidx.wear.compose.material.MaterialTheme import androidx.wear.compose.material.Text import com.google.android.horologist.annotations.ExperimentalHorologistApi @@ -30,22 +31,14 @@ import com.google.android.horologist.compose.layout.rememberResponsiveColumnStat import com.google.android.horologist.compose.material.ListHeaderDefaults.firstItemPadding import com.google.android.horologist.compose.material.ResponsiveListHeader import com.kgurgul.cpuinfo.domain.model.CpuData +import com.kgurgul.cpuinfo.domain.model.getKey +import com.kgurgul.cpuinfo.domain.model.getName +import com.kgurgul.cpuinfo.domain.model.getValue import com.kgurgul.cpuinfo.features.information.cpu.CpuInfoViewModel import com.kgurgul.cpuinfo.shared.Res import com.kgurgul.cpuinfo.shared.cpu -import com.kgurgul.cpuinfo.shared.cpu_abi -import com.kgurgul.cpuinfo.shared.cpu_cores import com.kgurgul.cpuinfo.shared.cpu_current_frequency import com.kgurgul.cpuinfo.shared.cpu_frequency_stopped -import com.kgurgul.cpuinfo.shared.cpu_has_neon -import com.kgurgul.cpuinfo.shared.cpu_l1d -import com.kgurgul.cpuinfo.shared.cpu_l1i -import com.kgurgul.cpuinfo.shared.cpu_l2 -import com.kgurgul.cpuinfo.shared.cpu_l3 -import com.kgurgul.cpuinfo.shared.cpu_l4 -import com.kgurgul.cpuinfo.shared.cpu_soc_name -import com.kgurgul.cpuinfo.shared.no -import com.kgurgul.cpuinfo.shared.yes import com.kgurgul.cpuinfo.ui.components.CpuProgressBar import com.kgurgul.cpuinfo.utils.formatHz import com.kgurgul.cpuinfo.wear.ui.components.WearCpuChip @@ -82,75 +75,15 @@ fun WearCpuInfoScreen(uiState: CpuInfoViewModel.UiState) { cpuData.frequencies.forEachIndexed { i, frequency -> item(key = "__frequency_$i") { FrequencyItem(index = i, frequency = frequency) } } - item(key = "__soc_name") { + items( + cpuData.cpuItems, + key = { it.getKey() }, + ) { itemValue -> WearCpuChip( - label = stringResource(Res.string.cpu_soc_name), - secondaryLabel = cpuData.processorName, + label = itemValue.getName(), + secondaryLabel = itemValue.getValue().replace("\n", ", "), ) } - item(key = "__abi") { - WearCpuChip( - label = stringResource(Res.string.cpu_abi), - secondaryLabel = cpuData.abi, - ) - } - item(key = "__cores") { - WearCpuChip( - label = stringResource(Res.string.cpu_cores), - secondaryLabel = cpuData.coreNumber.toString(), - ) - } - item(key = "__has_neon") { - WearCpuChip( - label = stringResource(Res.string.cpu_has_neon), - secondaryLabel = - if (cpuData.hasArmNeon) { - stringResource(Res.string.yes) - } else { - stringResource(Res.string.no) - }, - ) - } - if (cpuData.l1dCaches.isNotEmpty()) { - item(key = "__l1d") { - WearCpuChip( - label = stringResource(Res.string.cpu_l1d), - secondaryLabel = cpuData.l1dCaches.replace("\n", ", "), - ) - } - } - if (cpuData.l1iCaches.isNotEmpty()) { - item(key = "__l1i") { - WearCpuChip( - label = stringResource(Res.string.cpu_l1i), - secondaryLabel = cpuData.l1iCaches.replace("\n", ", "), - ) - } - } - if (cpuData.l2Caches.isNotEmpty()) { - item(key = "__l2") { - WearCpuChip( - label = stringResource(Res.string.cpu_l2), - secondaryLabel = cpuData.l2Caches.replace("\n", ", "), - ) - } - } - if (cpuData.l3Caches.isNotEmpty()) { - item(key = "__l3") { - WearCpuChip( - label = stringResource(Res.string.cpu_l3), - secondaryLabel = cpuData.l3Caches.replace("\n", ", "), - ) - } - } - if (cpuData.l4Caches.isNotEmpty()) { - item(key = "__l4") { - WearCpuChip( - label = stringResource(Res.string.cpu_l4), - secondaryLabel = cpuData.l4Caches.replace("\n", ", "), - ) - } - } } } }