diff --git a/.idea/gradle.xml b/.idea/gradle.xml index a2d7c21..ae388c2 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -7,6 +7,7 @@ + diff --git a/.idea/misc.xml b/.idea/misc.xml index 4c5e777..773fe0f 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/app/build.gradle b/app/build.gradle index af334b7..9312e0e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -29,11 +29,11 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 } kotlinOptions { - jvmTarget = '1.8' + jvmTarget = '17' } buildFeatures { compose true @@ -50,23 +50,23 @@ android { dependencies { - implementation 'androidx.core:core-ktx:1.9.0' + implementation 'androidx.core:core-ktx:1.10.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' - implementation 'androidx.activity:activity-compose:1.7.0' - implementation "androidx.compose.ui:ui:1.5.0-alpha01" - implementation "androidx.compose.ui:ui-tooling-preview:1.5.0-alpha01" - implementation 'androidx.compose.material3:material3:1.1.0-beta01' - implementation 'androidx.compose.material:material:1.5.0-alpha01' + implementation 'androidx.activity:activity-compose:1.7.2' + implementation "androidx.compose.ui:ui:1.5.0-beta01" + implementation "androidx.compose.ui:ui-tooling-preview:1.5.0-beta01" + implementation 'androidx.compose.material3:material3:1.2.0-alpha02' + implementation 'androidx.compose.material:material:1.5.0-beta01' testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.5' androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.5.0-alpha01" - debugImplementation "androidx.compose.ui:ui-tooling:1.5.0-alpha01" - debugImplementation "androidx.compose.ui:ui-test-manifest:1.5.0-alpha01" + androidTestImplementation "androidx.compose.ui:ui-test-junit4:1.5.0-beta01" + debugImplementation "androidx.compose.ui:ui-tooling:1.5.0-beta01" + debugImplementation "androidx.compose.ui:ui-test-manifest:1.5.0-beta01" - implementation "androidx.compose.material:material-icons-extended:1.5.0-alpha01" + implementation "androidx.compose.material:material-icons-extended:1.5.0-beta01" - implementation 'androidx.core:core-splashscreen:1.0.0' + implementation 'androidx.core:core-splashscreen:1.0.1' implementation 'androidx.navigation:navigation-compose:2.5.3' implementation("androidx.hilt:hilt-navigation-compose:1.1.0-alpha01") @@ -76,8 +76,8 @@ dependencies { implementation "com.google.accompanist:accompanist-permissions:0.26.3-beta" - implementation "com.patrykandpatrick.vico:core:1.6.4" - implementation "com.patrykandpatrick.vico:compose:1.6.4" - implementation "com.patrykandpatrick.vico:compose-m3:1.6.4" + implementation "com.patrykandpatrick.vico:core:1.6.6" + implementation "com.patrykandpatrick.vico:compose:1.6.6" + implementation "com.patrykandpatrick.vico:compose-m3:1.6.6" } \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/common/BottomDialog.kt b/app/src/main/java/llc/arma/ble/app/ui/common/BottomDialog.kt index 06706b3..a210baf 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/common/BottomDialog.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/common/BottomDialog.kt @@ -29,7 +29,7 @@ class BottomState @OptIn(ExperimentalMaterialApi::class) constructor( ) class BottomDialogState @OptIn(ExperimentalMaterialApi::class) constructor( - private val sheetState: ModalBottomSheetState?, + val sheetState: ModalBottomSheetState?, val setContent: (@Composable () -> Unit) -> Unit, ) { diff --git a/app/src/main/java/llc/arma/ble/app/ui/mapper/BleMapper.kt b/app/src/main/java/llc/arma/ble/app/ui/mapper/BleMapper.kt index ac08ef3..c0296c5 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/mapper/BleMapper.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/mapper/BleMapper.kt @@ -31,6 +31,12 @@ class BleMapper @Inject constructor( ) ) } + + is Ble.Accelerometer -> { + BleView.Accelerometer( + info = input.info, + ) + } } } diff --git a/app/src/main/java/llc/arma/ble/app/ui/mapper/BleViewMapper.kt b/app/src/main/java/llc/arma/ble/app/ui/mapper/BleViewMapper.kt index 0e622ab..c8717ad 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/mapper/BleViewMapper.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/mapper/BleViewMapper.kt @@ -31,6 +31,12 @@ class BleViewMapper @Inject constructor( ) ) } + + is BleView.Accelerometer -> { + Ble.Accelerometer( + info = input.info + ) + } } } diff --git a/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt b/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt index ddf1dfb..eb72931 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/model/BleView.kt @@ -9,6 +9,10 @@ sealed class BleView( val info: BleInfo ) { + class Accelerometer( + info: BleInfo + ) : BleView(info) + class Beacon( info: BleInfo, val state: BleState diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/BleInfoView.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/BleInfoView.kt index ef07c68..5b920ed 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/BleInfoView.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/BleInfoView.kt @@ -35,6 +35,7 @@ fun BleInfoView( imageVector = when(bleInfo.type){ BleInfo.Type.BEACON -> Icons.Rounded.Nfc BleInfo.Type.THERMOMETER -> Icons.Rounded.Thermostat + BleInfo.Type.ACCELEROMETER -> Icons.Rounded.Speed }, contentDescription = null ) @@ -43,6 +44,7 @@ fun BleInfoView( subtitle = when(bleInfo.type){ BleInfo.Type.BEACON -> "Маяк" BleInfo.Type.THERMOMETER -> "Термодатчик" + BleInfo.Type.ACCELEROMETER -> "Акселерометр" } ) diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListScreen.kt index ea79261..40c3dfb 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListScreen.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListScreen.kt @@ -240,6 +240,7 @@ private fun BleItem( imageVector = when(ble.type){ BleInfo.Type.BEACON -> Icons.Rounded.Nfc BleInfo.Type.THERMOMETER -> Icons.Rounded.Thermostat + BleInfo.Type.ACCELEROMETER -> Icons.Rounded.Speed }, contentDescription = null ) diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListViewModel.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListViewModel.kt index 19a7af9..7ed33d2 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListViewModel.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/ble/BleListViewModel.kt @@ -38,7 +38,8 @@ class BleListViewModel @Inject constructor( } - override fun setInitialState(): BleListContract.State = BleListContract.State(emptyList(), emptyList(), BleListContract.State.Filter()) + override fun setInitialState(): BleListContract.State = + BleListContract.State(emptyList(), emptyList(), BleListContract.State.Filter()) override fun handleEvents(event: BleListContract.Event) { when(event){ diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/ble/Filter.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/ble/Filter.kt index 30e8927..9ab47dd 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/ble/Filter.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/ble/Filter.kt @@ -43,6 +43,7 @@ private val BleInfo.Type?.localized: String return when(this){ BleInfo.Type.BEACON -> "Маяк" BleInfo.Type.THERMOMETER -> "Термодатчик" + BleInfo.Type.ACCELEROMETER -> "Акселерометр" null -> "Все" } } diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionContract.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionContract.kt index 775096d..314ffa9 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionContract.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionContract.kt @@ -4,8 +4,8 @@ import llc.arma.ble.app.ui.common.ViewEvent import llc.arma.ble.app.ui.common.ViewSideEffect import llc.arma.ble.app.ui.common.ViewState import llc.arma.ble.app.ui.model.BleView -import llc.arma.ble.app.ui.screen.beacon.BeaconContract -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract import llc.arma.ble.domain.common.BleException import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.usecase.GetBleBySerial diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionScreen.kt index 8b18f39..9b3fa1b 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionScreen.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionScreen.kt @@ -20,10 +20,11 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import llc.arma.ble.app.ui.model.BleView import llc.arma.ble.app.ui.screen.BleInfoView -import llc.arma.ble.app.ui.screen.beacon.BeaconScreen +import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerScreen +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconScreen import llc.arma.ble.app.ui.screen.password.ChangePasswordContract -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract -import llc.arma.ble.app.ui.screen.thermometer.ThermometerScreen +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerScreen import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.usecase.GetBleBySerial @@ -114,6 +115,10 @@ fun ConnectionScreen( } } + + is Ble.Accelerometer -> { + AccelerometerScreen(ble = state.ble) + } } } diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionViewModel.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionViewModel.kt index 17c6f81..f972246 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionViewModel.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/connection/ConnectionViewModel.kt @@ -10,8 +10,8 @@ import llc.arma.ble.app.ui.common.BaseViewModel import llc.arma.ble.app.ui.mapper.BleMapper import llc.arma.ble.app.ui.mapper.BleViewMapper import llc.arma.ble.app.ui.model.BleView -import llc.arma.ble.app.ui.screen.beacon.BeaconContract -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.usecase.GetBleBySerial import llc.arma.ble.domain.usecase.WriteBle diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerContract.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerContract.kt new file mode 100644 index 0000000..f2df050 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerContract.kt @@ -0,0 +1,41 @@ +package llc.arma.ble.app.ui.screen.inspection.accelerometer + +import llc.arma.ble.app.ui.common.ViewEvent +import llc.arma.ble.app.ui.common.ViewSideEffect +import llc.arma.ble.app.ui.common.ViewState +import llc.arma.ble.app.ui.model.BleView +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract +import llc.arma.ble.domain.model.Ble + +class AccelerometerContract { + + sealed class Event : ViewEvent { + + object OnShowAccelerometerMeasure : Event() + + object OnHideAccelerometerMeasure : Event() + + data class OnBleChanged( + val ble: Ble.Accelerometer, + ): Event() + + } + + sealed class State : ViewState { + + object Loading : State() + + data class Display( + val origin: Ble.Accelerometer, + val accelerometer: BleView.Accelerometer, + ) : State() + + } + + sealed class Effect : ViewSideEffect { + + object ShowAccelerometerMeasure : Effect() + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerScreen.kt new file mode 100644 index 0000000..8b95fc6 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerScreen.kt @@ -0,0 +1,92 @@ +package llc.arma.ble.app.ui.screen.inspection.accelerometer + +import androidx.compose.foundation.layout.Column +import androidx.compose.material.ExperimentalMaterialApi +import androidx.compose.material.ModalBottomSheetValue +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.runtime.setValue +import androidx.hilt.navigation.compose.hiltViewModel +import kotlinx.coroutines.delay +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.launch +import llc.arma.ble.app.ui.common.rememberBottomDialogState +import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.AccelerometerMeasure +import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.DisplayState +import llc.arma.ble.app.ui.screen.inspection.accelerometer.view.LoadingState +import llc.arma.ble.domain.model.Ble + +enum class SheetPage { + MEASURE_HISTORY +} + +@OptIn(ExperimentalMaterialApi::class) +@Composable +fun AccelerometerScreen( + ble: Ble.Accelerometer, +) { + + val viewModel = hiltViewModel() + val state = viewModel.viewState.value + + val bottomDialog = rememberBottomDialogState() + + LaunchedEffect(ble){ + viewModel.setEvent(AccelerometerContract.Event.OnBleChanged(ble)) + } + + var sheetPage by rememberSaveable { + mutableStateOf(null) + } + + LaunchedEffect(sheetPage) { + when (sheetPage) { + SheetPage.MEASURE_HISTORY -> launch { + val currentState = viewModel.viewState.value + + if (currentState is AccelerometerContract.State.Display) { + bottomDialog.show { + AccelerometerMeasure(ble = currentState.accelerometer.info) + } + } + } + null -> { + bottomDialog.hide() + } + } + } + + LaunchedEffect("effect"){ + viewModel.effect.onEach { + when(it){ + AccelerometerContract.Effect.ShowAccelerometerMeasure -> { + sheetPage = null + delay(100) + sheetPage = SheetPage.MEASURE_HISTORY + } + } + }.launchIn(this) + } + + Column { + + when(state){ + is AccelerometerContract.State.Display -> { + DisplayState( + origin = state.origin, + ble = state.accelerometer, + onEvent = { + viewModel.setEvent(it) + } + ) + } + is AccelerometerContract.State.Loading -> LoadingState() + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerViewModel.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerViewModel.kt new file mode 100644 index 0000000..34b09a9 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/AccelerometerViewModel.kt @@ -0,0 +1,70 @@ +package llc.arma.ble.app.ui.screen.inspection.accelerometer + +import dagger.hilt.android.lifecycle.HiltViewModel +import llc.arma.ble.app.ui.common.BaseViewModel +import llc.arma.ble.app.ui.mapper.BleMapper +import llc.arma.ble.app.ui.model.BleView +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract +import llc.arma.ble.domain.model.Ble +import javax.inject.Inject + +@HiltViewModel +class AccelerometerViewModel @Inject constructor( + private val bleMapper: BleMapper +) : BaseViewModel() { + + override fun setInitialState() = AccelerometerContract.State.Loading + + override fun handleEvents(event: AccelerometerContract.Event) { + when(event){ + is AccelerometerContract.Event.OnBleChanged -> reduce(viewState.value, event) + is AccelerometerContract.Event.OnHideAccelerometerMeasure -> reduce(viewState.value, event) + is AccelerometerContract.Event.OnShowAccelerometerMeasure -> reduce(viewState.value, event) + } + } + + private fun reduce( + state: AccelerometerContract.State, + event: AccelerometerContract.Event.OnHideAccelerometerMeasure + ) { + + + + } + + private fun reduce( + state: AccelerometerContract.State, + event: AccelerometerContract.Event.OnShowAccelerometerMeasure + ) { + + setEffect { + AccelerometerContract.Effect.ShowAccelerometerMeasure + } + + } + + private fun reduce( + state: AccelerometerContract.State, + event: AccelerometerContract.Event.OnBleChanged + ) { + + when (state) { + is AccelerometerContract.State.Display -> setState { + state.copy( + origin = Ble.Accelerometer( + info = event.ble.info + ) + ) + } + + is AccelerometerContract.State.Loading -> setState { + AccelerometerContract.State.Display( + origin = event.ble, + accelerometer = bleMapper.map(event.ble) as BleView.Accelerometer + ) + } + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterMeasure.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterMeasure.kt new file mode 100644 index 0000000..442d900 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/AcceleromterMeasure.kt @@ -0,0 +1,301 @@ +package llc.arma.ble.app.ui.screen.inspection.accelerometer.view + +import androidx.compose.animation.core.tween +import androidx.compose.foundation.layout.* +import androidx.compose.material3.* +import androidx.compose.runtime.* +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import androidx.hilt.navigation.compose.hiltViewModel +import androidx.lifecycle.viewModelScope +import com.patrykandpatrick.vico.compose.axis.vertical.startAxis +import com.patrykandpatrick.vico.compose.chart.Chart +import com.patrykandpatrick.vico.core.entry.ChartEntryModelProducer +import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.launch +import llc.arma.ble.app.ui.common.BaseViewModel +import llc.arma.ble.app.ui.common.ViewEvent +import llc.arma.ble.app.ui.common.ViewSideEffect +import llc.arma.ble.app.ui.common.ViewState +import llc.arma.ble.domain.model.BleInfo +import javax.inject.Inject +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.Refresh +import androidx.compose.ui.text.style.TextAlign +import com.patrykandpatrick.vico.compose.axis.horizontal.bottomAxis +import com.patrykandpatrick.vico.compose.chart.column.columnChart +import com.patrykandpatrick.vico.compose.chart.scroll.rememberChartScrollSpec +import com.patrykandpatrick.vico.core.chart.scale.AutoScaleUp +import com.patrykandpatrick.vico.core.entry.FloatEntry +import com.patrykandpatrick.vico.core.scroll.AutoScrollCondition +import com.patrykandpatrick.vico.core.scroll.InitialScroll +import kotlinx.coroutines.Job +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import llc.arma.ble.domain.usecase.GetAccelerometerMeasureBySerialFlow + +@Composable +fun AccelerometerMeasure( + ble: BleInfo +) { + + val viewModel = hiltViewModel() + val state = viewModel.viewState.value + + LaunchedEffect(ble.serial) { + viewModel.setEvent(AccelerometerMeasureContract.Event.OnStart(ble.serial)) + } + + DisposableEffect(key1 = ble.serial, effect = { + onDispose { + viewModel.setEvent(AccelerometerMeasureContract.Event.StopMeasure) + } + }) + + Column( + modifier = Modifier.fillMaxHeight(0.9f) + ) { + + Row( + modifier = Modifier.padding(horizontal = 12.dp), + verticalAlignment = Alignment.CenterVertically + ) { + + val title = when(state){ + is AccelerometerMeasureContract.State.Display -> { + "История измерений" + } + AccelerometerMeasureContract.State.Exception -> "История измерений" + } + + Text( + modifier = Modifier.weight(1f), + text = title, + style = MaterialTheme.typography.titleLarge + ) + + IconButton( + onClick = { + viewModel.setEvent(AccelerometerMeasureContract.Event.OnRefreshHistory(ble.serial)) + }, + enabled = true + ) { + Icon( + imageVector = Icons.Rounded.Refresh, + contentDescription = null + ) + } + + } + + Spacer(modifier = Modifier.height(16.dp)) + + Box(modifier = Modifier) { + + when (state) { + is AccelerometerMeasureContract.State.Display -> Display(state = state) + AccelerometerMeasureContract.State.Exception -> Exception() + } + + } + + } + +} + + +@Composable +fun Display( + state: AccelerometerMeasureContract.State.Display +) { + + Box(modifier = Modifier + .padding(8.dp) + .fillMaxSize() + ) { + + + if (state.measureHistory.isEmpty()) { + + Text( + modifier = Modifier.align(Alignment.Center), + text = "Нет данных" + ) + + } else { + + val producer = remember { + ChartEntryModelProducer(listOf()) + } + + producer.setEntries(state.measureHistory.mapIndexed { index, measurePoint -> + FloatEntry(index.toFloat(), measurePoint) + }) + + val lineChart = columnChart() + + Chart( + chart = lineChart, + chartModelProducer = producer, + startAxis = startAxis(), + bottomAxis = bottomAxis(), + modifier = Modifier.fillMaxSize(), + autoScaleUp = AutoScaleUp.None, + diffAnimationSpec = tween(0), + chartScrollSpec = rememberChartScrollSpec( + initialScroll = InitialScroll.End, + autoScrollCondition = AutoScrollCondition.OnModelSizeIncreased + ) + ) + + } + + + } +} + +@Composable +fun Exception( + +) { + Box( + modifier = Modifier + .padding(8.dp) + .fillMaxWidth() + .aspectRatio(2f), + ){ + + Text( + textAlign = TextAlign.Center, + text = "Во время загрузки произошла ошибка", + modifier = Modifier.align(Alignment.Center) + ) + + } + +} + +class AccelerometerMeasureContract { + + sealed class Event : ViewEvent { + + object StopMeasure : Event() + + data class OnStart( + val serial: String + ) : Event() + + data class OnRefreshHistory( + val serial: String + ) : Event() + + } + + sealed class State : ViewState { + + data class Display( + val measureHistory : List + ) : State() + + object Exception : State() + + } + + sealed class Effect : ViewSideEffect { + + } + +} + + + +@HiltViewModel +class AccelerometerHistoryViewModel @Inject constructor( + private val getAccelerometerMeasureBySerialFlow: GetAccelerometerMeasureBySerialFlow, +) : BaseViewModel() { + + var measureJob: Job? = null + + private var lastSerial: String? = null + + override fun setInitialState() = AccelerometerMeasureContract.State.Display( + emptyList() + ) + + override fun handleEvents(event: AccelerometerMeasureContract.Event) { + when(event){ + is AccelerometerMeasureContract.Event.OnStart -> reduce(viewState.value, event) + is AccelerometerMeasureContract.Event.OnRefreshHistory -> reduce(viewState.value, event) + is AccelerometerMeasureContract.Event.StopMeasure -> reduce(viewState.value, event) + } + } + + private fun reduce( + state: AccelerometerMeasureContract.State, + event: AccelerometerMeasureContract.Event.StopMeasure + ) { + + measureJob?.cancel() + setState { + AccelerometerMeasureContract.State.Display(emptyList()) + } + + } + + private fun reduce( + state: AccelerometerMeasureContract.State, + event: AccelerometerMeasureContract.Event.OnStart + ) { + + startReadMeasure(event.serial, false) + + } + + private fun reduce( + state: AccelerometerMeasureContract.State, + event: AccelerometerMeasureContract.Event.OnRefreshHistory + ) { + startReadMeasure(event.serial, true) + } + + private fun startReadMeasure(serial: String, restartJob: Boolean){ + + if(restartJob || measureJob == null) { + measureJob = viewModelScope.launch { + + setState { + AccelerometerMeasureContract.State.Display(emptyList()) + } + + getAccelerometerMeasureBySerialFlow(serial).onEach { + it.fold( + onSuccess = { + setState { + when (this) { + is AccelerometerMeasureContract.State.Display -> { + val dataList = this.measureHistory.toMutableList().apply { + add(it) + } + AccelerometerMeasureContract.State.Display(dataList) + } + + AccelerometerMeasureContract.State.Exception -> { + AccelerometerMeasureContract.State.Display(listOf(it)) + } + } + } + }, + onFailure = { + setState { + AccelerometerMeasureContract.State.Exception + } + } + ) + }.launchIn(this) + + } + } + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/DisplayState.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/DisplayState.kt new file mode 100644 index 0000000..1da0541 --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/DisplayState.kt @@ -0,0 +1,121 @@ +package llc.arma.ble.app.ui.screen.inspection.accelerometer.view + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.rounded.KeyboardArrowDown +import androidx.compose.material.icons.rounded.KeyboardArrowRight +import androidx.compose.material.icons.rounded.Refresh +import androidx.compose.material3.* +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.unit.dp +import llc.arma.ble.app.ui.model.BleView +import llc.arma.ble.app.ui.screen.BleInfoView +import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract +import llc.arma.ble.domain.model.Ble + +@Composable +fun DisplayState( + onEvent: (AccelerometerContract.Event) -> Unit, + origin: Ble.Accelerometer, + ble: BleView.Accelerometer +) { + + Column() { + + Column( + modifier = Modifier + .verticalScroll(rememberScrollState()) + .weight(1f) + ) { + + Box( + modifier = Modifier.padding( + vertical = 8.dp, + horizontal = 8.dp + ) + ) { + BleInfoView(bleInfo = origin.info) + } + + Column( + modifier = Modifier, + content = { + + Box( + modifier = Modifier.padding( + vertical = 8.dp, + horizontal = 8.dp + ) + ) { + + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clip(RoundedCornerShape(16.dp)) + .clickable { + onEvent(AccelerometerContract.Event.OnShowAccelerometerMeasure) + } + .padding(8.dp) + ) { + + Column( + modifier = Modifier.weight(1f) + ) { + + Text( + text = "График измерений" + ) + + } + + Icon( + imageVector = Icons.Rounded.KeyboardArrowRight, + contentDescription = null + ) + + } + + } + + } + ) + + } + + Surface( + modifier = Modifier + .fillMaxWidth() + .padding(8.dp) + .height(50.dp), + shape = CircleShape, + color = MaterialTheme.colorScheme.primaryContainer, + onClick = { + + } + ) { + + Box(modifier = Modifier.fillMaxSize()) { + + Text( + modifier = Modifier.align(Alignment.Center), + color = MaterialTheme.colorScheme.background, + style = MaterialTheme.typography.labelLarge, + text = "Сохранить" + ) + + } + + } + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/LoadingState.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/LoadingState.kt new file mode 100644 index 0000000..c2906be --- /dev/null +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/accelerometer/view/LoadingState.kt @@ -0,0 +1,19 @@ +package llc.arma.ble.app.ui.screen.inspection.accelerometer.view + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier + +@Composable +fun LoadingState(){ + + Box(modifier = Modifier.fillMaxSize()) { + + CircularProgressIndicator(modifier = Modifier.align(Alignment.Center)) + + } + +} \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconContract.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconContract.kt similarity index 93% rename from app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconContract.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconContract.kt index 111e144..0163ec7 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconContract.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconContract.kt @@ -1,10 +1,10 @@ -package llc.arma.ble.app.ui.screen.beacon +package llc.arma.ble.app.ui.screen.inspection.beacon import llc.arma.ble.app.ui.common.ViewEvent import llc.arma.ble.app.ui.common.ViewSideEffect import llc.arma.ble.app.ui.common.ViewState import llc.arma.ble.app.ui.model.BleView -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract import llc.arma.ble.domain.model.Ble class BeaconContract { diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconScreen.kt similarity index 92% rename from app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconScreen.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconScreen.kt index b705260..f51336e 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconScreen.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconScreen.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.beacon +package llc.arma.ble.app.ui.screen.inspection.beacon import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape @@ -19,10 +19,10 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch import llc.arma.ble.app.ui.common.rememberBottomDialogState -import llc.arma.ble.app.ui.screen.beacon.view.DisplayState -import llc.arma.ble.app.ui.screen.beacon.view.PowerEdit -import llc.arma.ble.app.ui.screen.beacon.view.Write -import llc.arma.ble.app.ui.screen.thermometer.localizedName +import llc.arma.ble.app.ui.screen.inspection.beacon.view.DisplayState +import llc.arma.ble.app.ui.screen.inspection.beacon.view.PowerEdit +import llc.arma.ble.app.ui.screen.inspection.beacon.view.Write +import llc.arma.ble.app.ui.screen.inspection.thermometer.localizedName import llc.arma.ble.domain.model.Ble enum class SheetPage { diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconViewModel.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconViewModel.kt similarity index 98% rename from app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconViewModel.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconViewModel.kt index 3131922..ee49d92 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/BeaconViewModel.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/BeaconViewModel.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.beacon +package llc.arma.ble.app.ui.screen.inspection.beacon import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.viewModelScope @@ -11,7 +11,7 @@ import llc.arma.ble.app.ui.common.BaseViewModel import llc.arma.ble.app.ui.mapper.BleMapper import llc.arma.ble.app.ui.mapper.BleViewMapper import llc.arma.ble.app.ui.model.BleView -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract import llc.arma.ble.domain.model.Ble import llc.arma.ble.domain.model.BleInfo import llc.arma.ble.domain.usecase.WriteBle diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/DisplayState.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/DisplayState.kt similarity index 97% rename from app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/DisplayState.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/DisplayState.kt index fcfdeec..37b7ee2 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/DisplayState.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/DisplayState.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.beacon.view +package llc.arma.ble.app.ui.screen.inspection.beacon.view import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -17,7 +17,7 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import llc.arma.ble.app.ui.model.BleView import llc.arma.ble.app.ui.screen.BleInfoView -import llc.arma.ble.app.ui.screen.beacon.BeaconContract +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract import llc.arma.ble.domain.model.Ble @Composable diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/PowerEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/PowerEdit.kt similarity index 92% rename from app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/PowerEdit.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/PowerEdit.kt index cc8d363..7adf422 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/PowerEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/PowerEdit.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.beacon.view +package llc.arma.ble.app.ui.screen.inspection.beacon.view import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -14,8 +14,8 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import llc.arma.ble.app.ui.model.BleView -import llc.arma.ble.app.ui.screen.beacon.BeaconContract -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract @Composable fun PowerEdit( diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/Write.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/Write.kt similarity index 98% rename from app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/Write.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/Write.kt index 2ca56dd..3566797 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/beacon/view/Write.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/beacon/view/Write.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.beacon.view +package llc.arma.ble.app.ui.screen.inspection.beacon.view import androidx.compose.animation.animateContentSize import androidx.compose.foundation.Image @@ -17,8 +17,8 @@ import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import llc.arma.ble.R -import llc.arma.ble.app.ui.screen.beacon.BeaconContract -import llc.arma.ble.app.ui.screen.thermometer.localizedName +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.localizedName @Composable fun Write( diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerContract.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerContract.kt similarity index 97% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerContract.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerContract.kt index 3cf8d16..364eb0d 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerContract.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerContract.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer +package llc.arma.ble.app.ui.screen.inspection.thermometer import llc.arma.ble.app.ui.common.ViewEvent import llc.arma.ble.app.ui.common.ViewSideEffect diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerScreen.kt similarity index 84% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerScreen.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerScreen.kt index 26f73e6..465efe2 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerScreen.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerScreen.kt @@ -1,34 +1,26 @@ -package llc.arma.ble.app.ui.screen.thermometer +package llc.arma.ble.app.ui.screen.inspection.thermometer -import androidx.compose.foundation.Image -import androidx.compose.foundation.clickable -import androidx.compose.foundation.layout.* -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.layout.Column import androidx.compose.material.ExperimentalMaterialApi -import androidx.compose.material.ModalBottomSheetLayout -import androidx.compose.material.ModalBottomSheetValue -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.rounded.KeyboardArrowDown -import androidx.compose.material3.* -import androidx.compose.runtime.* +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.saveable.rememberSaveable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.alpha -import androidx.compose.ui.draw.clip -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.unit.dp +import androidx.compose.runtime.setValue import androidx.hilt.navigation.compose.hiltViewModel -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch -import llc.arma.ble.R import llc.arma.ble.app.ui.common.rememberBottomDialogState -import llc.arma.ble.app.ui.screen.thermometer.view.* +import llc.arma.ble.app.ui.screen.inspection.thermometer.view.DisplayState +import llc.arma.ble.app.ui.screen.inspection.thermometer.view.IntervalEdit +import llc.arma.ble.app.ui.screen.inspection.thermometer.view.LoadingState +import llc.arma.ble.app.ui.screen.inspection.thermometer.view.PowerEdit +import llc.arma.ble.app.ui.screen.inspection.thermometer.view.TemperatureHistory +import llc.arma.ble.app.ui.screen.inspection.thermometer.view.Write import llc.arma.ble.domain.model.Ble enum class SheetPage { @@ -74,7 +66,6 @@ fun ThermometerScreen( val viewModel = hiltViewModel() val state = viewModel.viewState.value - val bottomDialog = rememberBottomDialogState() LaunchedEffect(sheetPage){ @@ -142,8 +133,6 @@ fun ThermometerScreen( } } - val writeSheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) - LaunchedEffect("effect"){ viewModel.effect.onEach { when(it){ diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerViewModel.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerViewModel.kt similarity index 98% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerViewModel.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerViewModel.kt index 50d6323..875963d 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/ThermometerViewModel.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/ThermometerViewModel.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer +package llc.arma.ble.app.ui.screen.inspection.thermometer import androidx.lifecycle.viewModelScope import dagger.hilt.android.lifecycle.HiltViewModel @@ -201,7 +201,9 @@ class ThermometerViewModel @Inject constructor( setState { state.copy( - writeState = ThermometerContract.State.Display.WriteState.Writing(request.writeRequest) + writeState = ThermometerContract.State.Display.WriteState.Writing( + request.writeRequest + ) ) } diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/DisplayState.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/DisplayState.kt similarity index 97% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/DisplayState.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/DisplayState.kt index 9e84880..90f47a8 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/DisplayState.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/DisplayState.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer.view +package llc.arma.ble.app.ui.screen.inspection.thermometer.view import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -18,7 +18,8 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import llc.arma.ble.app.ui.model.BleView import llc.arma.ble.app.ui.screen.BleInfoView -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.accelerometer.AccelerometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract import llc.arma.ble.domain.model.Ble @Composable diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/IntervalEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/IntervalEdit.kt similarity index 90% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/IntervalEdit.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/IntervalEdit.kt index a4174d4..b5b623f 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/IntervalEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/IntervalEdit.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer.view +package llc.arma.ble.app.ui.screen.inspection.thermometer.view import androidx.compose.animation.* import androidx.compose.foundation.layout.* @@ -12,7 +12,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import llc.arma.ble.app.ui.model.BleView -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract @Composable fun IntervalEdit( @@ -165,11 +165,11 @@ fun NumberPicker( targetState = value, transitionSpec = { if (targetState > initialState) { - slideInVertically { height -> height } + fadeIn() with - slideOutVertically { height -> -height } + fadeOut() + (slideInVertically { height -> height } + fadeIn()).togetherWith( + slideOutVertically { height -> -height } + fadeOut()) } else { - slideInVertically { height -> -height } + fadeIn() with - slideOutVertically { height -> height } + fadeOut() + (slideInVertically { height -> -height } + fadeIn()).togetherWith( + slideOutVertically { height -> height } + fadeOut()) }.using( SizeTransform(clip = false) ) diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/LoadingState.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/LoadingState.kt similarity index 87% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/LoadingState.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/LoadingState.kt index e00544c..c8d83cb 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/LoadingState.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/LoadingState.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer.view +package llc.arma.ble.app.ui.screen.inspection.thermometer.view import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/PowerEdit.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/PowerEdit.kt similarity index 94% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/PowerEdit.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/PowerEdit.kt index 038aacd..cb38f26 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/PowerEdit.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/PowerEdit.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer.view +package llc.arma.ble.app.ui.screen.inspection.thermometer.view import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.* @@ -14,7 +14,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp import llc.arma.ble.app.ui.model.BleView -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract @Composable fun PowerEdit( diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/TemperatureHistory.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/TemperatureHistory.kt similarity index 99% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/TemperatureHistory.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/TemperatureHistory.kt index 13bc000..0fd548a 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/TemperatureHistory.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/TemperatureHistory.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer.view +package llc.arma.ble.app.ui.screen.inspection.thermometer.view import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.animateFloatAsState diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/Write.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/Write.kt similarity index 98% rename from app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/Write.kt rename to app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/Write.kt index c22a591..7bb8f81 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/thermometer/view/Write.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/inspection/thermometer/view/Write.kt @@ -1,4 +1,4 @@ -package llc.arma.ble.app.ui.screen.thermometer.view +package llc.arma.ble.app.ui.screen.inspection.thermometer.view import androidx.compose.animation.animateContentSize import androidx.compose.foundation.Image @@ -19,8 +19,8 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import kotlinx.coroutines.launch import llc.arma.ble.R -import llc.arma.ble.app.ui.screen.thermometer.ThermometerContract -import llc.arma.ble.app.ui.screen.thermometer.localizedName +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.localizedName @Composable fun Write( diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/main/MainScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/main/MainScreen.kt index eedfd3b..eff2554 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/main/MainScreen.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/main/MainScreen.kt @@ -6,9 +6,9 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.dialog import androidx.navigation.compose.rememberNavController -import llc.arma.ble.app.ui.screen.beacon.BeaconContract -import llc.arma.ble.app.ui.screen.thermometer.ThermometerScreen -import llc.arma.ble.app.ui.screen.beacon.BeaconScreen +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconContract +import llc.arma.ble.app.ui.screen.inspection.thermometer.ThermometerScreen +import llc.arma.ble.app.ui.screen.inspection.beacon.BeaconScreen import llc.arma.ble.app.ui.screen.ble.BleListContract import llc.arma.ble.app.ui.screen.ble.BleListScreen import llc.arma.ble.app.ui.screen.connection.ConnectionContract diff --git a/app/src/main/java/llc/arma/ble/app/ui/screen/password/ChangePasswordScreen.kt b/app/src/main/java/llc/arma/ble/app/ui/screen/password/ChangePasswordScreen.kt index 1a1041e..679aa45 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/screen/password/ChangePasswordScreen.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/screen/password/ChangePasswordScreen.kt @@ -23,7 +23,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import llc.arma.ble.app.ui.screen.password.view.Loading import llc.arma.ble.app.ui.screen.password.view.Result -import llc.arma.ble.app.ui.screen.thermometer.view.LoadingState +import llc.arma.ble.app.ui.screen.inspection.thermometer.view.LoadingState @Composable fun ChangePasswordScreen( diff --git a/app/src/main/java/llc/arma/ble/app/ui/theme/Theme.kt b/app/src/main/java/llc/arma/ble/app/ui/theme/Theme.kt index fe95c42..73dd177 100644 --- a/app/src/main/java/llc/arma/ble/app/ui/theme/Theme.kt +++ b/app/src/main/java/llc/arma/ble/app/ui/theme/Theme.kt @@ -72,7 +72,7 @@ fun BleTheme( SideEffect { currentWindow.statusBarColor = LightColorScheme.primary.copy(alpha = 0f).toArgb() - WindowCompat.getInsetsController(currentWindow, view).isAppearanceLightStatusBars = darkTheme.not() + WindowCompat.getInsetsController(currentWindow, view).isAppearanceLightStatusBars = true } } diff --git a/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt b/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt index c7c8086..824a17c 100644 --- a/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt +++ b/app/src/main/java/llc/arma/ble/data/BleRepositoryImpl.kt @@ -11,6 +11,7 @@ import android.os.Build import android.os.SystemClock import android.util.Log import androidx.core.app.ActivityCompat +import androidx.core.util.toRange import kotlinx.coroutines.* import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.Flow @@ -27,6 +28,7 @@ import java.util.* import javax.inject.Inject import javax.inject.Singleton import kotlin.coroutines.resume +import kotlin.random.Random val serviceUUID: UUID = UUID.fromString("a77db03a-9bc4-11ed-a8fc-0242ac120002") @@ -83,8 +85,9 @@ class BleRepositoryImpl @Inject constructor( private val ScanResult.type: BleInfo.Type get() { return when(scanRecord?.manufacturerSpecificData?.get(89)?.get(0)?.toUByte()?.toInt()){ + 1 -> BleInfo.Type.BEACON 2 -> BleInfo.Type.THERMOMETER - else -> BleInfo.Type.BEACON + else -> BleInfo.Type.ACCELEROMETER } } @@ -135,13 +138,13 @@ class BleRepositoryImpl @Inject constructor( if (checkPermission()) { - if (result.scanRecord?.deviceName?.contains("ArmA") == true) { + //if (result.scanRecord?.deviceName?.contains("ArmA") == true) { resultList[result.device.address] = result.info deviceCache[result.device.address] = result - } + //} } else { CoroutineScope(Dispatchers.IO).launch { @@ -227,6 +230,38 @@ class BleRepositoryImpl @Inject constructor( deviceCache[serial]?.let { result -> return when(result.info.type) { + BleInfo.Type.ACCELEROMETER -> { + Result.success( + flow { + + while (true) { + + deviceCache[serial]?.let { newResult -> + + emit( + + Ble.Accelerometer( + info = newResult.info.copy( + rssi = if((SystemClock.elapsedRealtimeNanos() - newResult.timestampNanos) > 15_000_000_000) { + null + } else { + newResult.rssi + } + + ) + ) + + ) + + } + + delay(1_000) + + } + + } + ) + } BleInfo.Type.BEACON -> { Result.success( flow { @@ -342,6 +377,9 @@ class BleRepositoryImpl @Inject constructor( } + BleInfo.Type.ACCELEROMETER -> { + TODO() + } } } @@ -577,6 +615,19 @@ class BleRepositoryImpl @Inject constructor( return Result.success(Unit) } + override fun getAccelerometerMeasureBySerialFlow(serial: String): Flow> { + + return flow { + + while (true){ + delay(1000) + emit( + Result.success(((-256)..256).random().toFloat()) + ) + } + } + } + private suspend fun readCharacteristic( device: BluetoothDevice, serviceId: UUID, diff --git a/app/src/main/java/llc/arma/ble/domain/model/Ble.kt b/app/src/main/java/llc/arma/ble/domain/model/Ble.kt index 8a5f256..e09f848 100644 --- a/app/src/main/java/llc/arma/ble/domain/model/Ble.kt +++ b/app/src/main/java/llc/arma/ble/domain/model/Ble.kt @@ -4,6 +4,12 @@ sealed class Ble( val info: BleInfo ) { + class Accelerometer( + info: BleInfo + ): Ble(info){ + + } + class Beacon( info: BleInfo, val state: BleState diff --git a/app/src/main/java/llc/arma/ble/domain/model/BleInfo.kt b/app/src/main/java/llc/arma/ble/domain/model/BleInfo.kt index ac85156..4043f33 100644 --- a/app/src/main/java/llc/arma/ble/domain/model/BleInfo.kt +++ b/app/src/main/java/llc/arma/ble/domain/model/BleInfo.kt @@ -10,7 +10,7 @@ data class BleInfo( ){ enum class Type { - BEACON, THERMOMETER + BEACON, THERMOMETER, ACCELEROMETER } } \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/domain/repository/BleRepository.kt b/app/src/main/java/llc/arma/ble/domain/repository/BleRepository.kt index 9244462..0be5155 100644 --- a/app/src/main/java/llc/arma/ble/domain/repository/BleRepository.kt +++ b/app/src/main/java/llc/arma/ble/domain/repository/BleRepository.kt @@ -24,5 +24,6 @@ interface BleRepository { suspend fun writeBle(serial: String, request: Ble.Beacon.WriteRequest): Result suspend fun changeBlePassword(password: String, serial: String): Result + fun getAccelerometerMeasureBySerialFlow(serial: String): Flow> } \ No newline at end of file diff --git a/app/src/main/java/llc/arma/ble/domain/usecase/GetAccelerometerMeasureBySerialFlow.kt b/app/src/main/java/llc/arma/ble/domain/usecase/GetAccelerometerMeasureBySerialFlow.kt new file mode 100644 index 0000000..6a5bbce --- /dev/null +++ b/app/src/main/java/llc/arma/ble/domain/usecase/GetAccelerometerMeasureBySerialFlow.kt @@ -0,0 +1,21 @@ +package llc.arma.ble.domain.usecase + +import kotlinx.coroutines.flow.Flow +import llc.arma.ble.domain.Result +import llc.arma.ble.domain.common.BleException +import llc.arma.ble.domain.common.ProgressState +import llc.arma.ble.domain.model.Ble +import llc.arma.ble.domain.repository.BleRepository +import javax.inject.Inject + +class GetAccelerometerMeasureBySerialFlow @Inject constructor( + private val bleRepository: BleRepository +) { + + operator fun invoke(serial: String): Flow> { + + return bleRepository.getAccelerometerMeasureBySerialFlow(serial) + + } + +} \ No newline at end of file diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index d75ad32..69732a0 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -12,7 +12,7 @@ \ No newline at end of file diff --git a/build.gradle b/build.gradle index fc8cfbc..40dc16d 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { dependencies { classpath('com.google.dagger:hilt-android-gradle-plugin:2.45') - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.8.10" } repositories { mavenCentral() @@ -14,7 +14,7 @@ buildscript { }// Top-level build file where you can add configuration options common to all sub-projects/modules. plugins { - id 'com.android.application' version '8.0.0' apply false - id 'com.android.library' version '8.0.0' apply false + id 'com.android.application' version '8.0.2' apply false + id 'com.android.library' version '8.0.2' apply false id 'org.jetbrains.kotlin.android' version '1.7.0' apply false } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a2e90d8..f2b979f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -22,4 +22,5 @@ kotlin.code.style=official # thereby reducing the size of the R class for that library android.nonTransitiveRClass=true android.defaults.buildfeatures.buildconfig=true -android.nonFinalResIds=false \ No newline at end of file +android.nonFinalResIds=false +org.gradle.unsafe.configuration-cache=true \ No newline at end of file