diff --git a/app/build.gradle.kts b/app/build.gradle.kts index baa4f27..8247bdc 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -74,63 +74,44 @@ dependencies { debugImplementation(libs.ui.tooling) debugImplementation(libs.ui.test.manifest) + + //-- Navigation val nav_version = "2.5.3" - // Java language implementation - implementation("androidx.navigation:navigation-fragment:$nav_version") - implementation("androidx.navigation:navigation-ui:$nav_version") - - // Kotlin implementation("androidx.navigation:navigation-fragment-ktx:$nav_version") implementation("androidx.navigation:navigation-ui-ktx:$nav_version") - - // Feature module Support implementation("androidx.navigation:navigation-dynamic-features-fragment:$nav_version") - - // Testing Navigation androidTestImplementation("androidx.navigation:navigation-testing:$nav_version") - - // Jetpack Compose Integration implementation("androidx.navigation:navigation-compose:$nav_version") - val room_version = "2.5.1" - - implementation("androidx.room:room-runtime:$room_version") - annotationProcessor("androidx.room:room-compiler:$room_version") + //-- Room // To use Kotlin annotation processing tool (kapt) //kapt("androidx.room:room-compiler:$room_version") // To use Kotlin Symbol Processing (KSP) + val room_version = "2.5.1" + ksp("androidx.room:room-compiler:$room_version") - - // optional - Kotlin Extensions and Coroutines support for Room + annotationProcessor("androidx.room:room-compiler:$room_version") + implementation("androidx.room:room-runtime:$room_version") implementation("androidx.room:room-ktx:$room_version") - - // optional - RxJava2 support for Room - implementation("androidx.room:room-rxjava2:$room_version") - - // optional - RxJava3 support for Room - implementation("androidx.room:room-rxjava3:$room_version") - - // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:$room_version") - - // optional - Test helpers testImplementation("androidx.room:room-testing:$room_version") - - // optional - Paging 3 Integration implementation("androidx.room:room-paging:$room_version") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0") + //-- Ktor + val ktor_version = "2.3.1" + implementation("io.ktor:ktor-client-core:$ktor_version") + implementation("io.ktor:ktor-client-cio:$ktor_version") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0") implementation(platform("dev.forkhandles:forkhandles-bom:2.6.0.0")) implementation("dev.forkhandles:result4k") - implementation("io.ktor:ktor-client-core:2.3.1") implementation("io.ktor:ktor-client-okhttp:2.3.1") - implementation("androidx.security:security-crypto-ktx:1.1.0-alpha06") + // For Identity Credential APIs implementation("androidx.security:security-identity-credential:1.0.0-alpha03") @@ -144,4 +125,13 @@ dependencies { implementation("org.jetbrains.kotlinx:kotlinx-datetime:0.4.0") + //-- Map Compose library + implementation("ovh.plrapps:mapcompose:2.7.1") + + + //-- Glide + implementation("com.github.bumptech.glide:glide:4.14.2") + implementation("com.github.bumptech.glide:compose:1.0.0-alpha.1") + + } \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/MainActivity.kt b/app/src/main/java/ru/nm17/narodmon/MainActivity.kt index 4a14373..fb62ffc 100644 --- a/app/src/main/java/ru/nm17/narodmon/MainActivity.kt +++ b/app/src/main/java/ru/nm17/narodmon/MainActivity.kt @@ -1,6 +1,4 @@ -@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalMaterial3Api::class, - ExperimentalMaterial3Api::class -) + package ru.nm17.narodmon @@ -25,74 +23,44 @@ 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.tooling.preview.Preview -import androidx.navigation.compose.NavHost -import androidx.navigation.compose.composable -import androidx.navigation.compose.rememberNavController import androidx.room.Room -import androidx.security.crypto.EncryptedSharedPreferences -import androidx.security.crypto.MasterKeys import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import ru.nm17.narodmon.db.AppDatabase import ru.nm17.narodmon.db.entities.KVSetting -import ru.nm17.narodmon.ui.elements.AgreementDialog -import ru.nm17.narodmon.ui.pages.SensorsPage +import ru.nm17.narodmon.ui.dialogs.AgreementDialog +import ru.nm17.narodmon.ui.navHost.AppNavHost import ru.nm17.narodmon.ui.theme.NarodMonTheme -@Composable -fun AppNavHost() { - val navController = rememberNavController() - val coScope = rememberCoroutineScope() - - - - NavHost(navController = navController, startDestination = "sensors") { - composable("agreement") { - - } - composable("sensors") { - - SensorsPage(navController) - } - - /*...*/ - } -} - class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "data" ).build() - val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) - - val sharedPreferences = EncryptedSharedPreferences.create( - "secret_shared_prefs", - masterKeyAlias, - createDeviceProtectedStorageContext(), - EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, - EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM - ) +// val masterKeyAlias = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) +// +// val sharedPreferences = EncryptedSharedPreferences.create( +// "secret_shared_prefs", +// masterKeyAlias, +// createDeviceProtectedStorageContext(), +// EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, +// EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM +// ) // use the shared preferences and editor as you normally would // use the shared preferences and editor as you normally would - val credSharedPreferences = sharedPreferences - - +// val credSharedPreferences = sharedPreferences setContent { val coScope = rememberCoroutineScope() - //var asd = getPreferences() NarodMonTheme { @@ -125,44 +93,15 @@ class MainActivity : ComponentActivity() { Text(text = stringResource(R.string.waiting_for_user_agreement)) } } - } else { AppNavHost() } - - - - // A surface container using the 'background' color from the theme - - - - } } } } - - -@Composable -fun Greeting(name: String, modifier: Modifier = Modifier) { - Text( - text = "Hello $name!", - modifier = modifier - ) -} - @Composable fun NavHolderEl() { //NavHost(navController = NavHostController(N), graph =) } - - - -@Preview(showBackground = true) -@Composable -fun GreetingPreview() { - NarodMonTheme { - Greeting("Android") - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/client.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/client.kt index ec594fe..d3a4fe8 100644 --- a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/client.kt +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/client.kt @@ -16,8 +16,10 @@ import io.ktor.http.headers import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flowOn +import kotlinx.coroutines.flow.take import kotlinx.datetime.Clock import kotlinx.serialization.Serializable import kotlinx.serialization.SerializationException @@ -120,7 +122,7 @@ class Client private constructor( val client = this.httpClient1Min return flow> { - val resp = client.post("https://narodmon.ru/api") { + val resp = this@Client.httpClient1Min.take(1).first().post("https://narodmon.ru/api") { contentType(ContentType.Application.Json) setBody( getJSONRequestBody("appInit", request) @@ -132,7 +134,7 @@ class Client private constructor( }.flowOn(Dispatchers.IO) } - public fun appInit(request: AppInitRequest): Flow> { + /*public fun jjhgjhg(request: AppInitRequest): Flow> { val client = this.httpClient1Min return flow> { @@ -147,5 +149,5 @@ class Client private constructor( }.flowOn(Dispatchers.IO) - } + }*/ } \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/SensorEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/SensorEntity.kt new file mode 100644 index 0000000..438c953 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/SensorEntity.kt @@ -0,0 +1,16 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities + + +data class SensorEntity( + val changed: Int, + val fav: Int, + val id: Int, + val mac: String, + val name: String, + val pub: Int, + val time: Int, + val trend: Int, + val type: Int, + val unit: String, + val value: Double +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/addLike/AddLikeRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/addLike/AddLikeRequestEntity.kt new file mode 100644 index 0000000..a755a22 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/addLike/AddLikeRequestEntity.kt @@ -0,0 +1,8 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.addLike + +data class AddLikeRequestEntity( + val api_key: String, + val cmd: String, + val id: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/addLike/AddLikeResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/addLike/AddLikeResponseEntity.kt new file mode 100644 index 0000000..a70ff7e --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/addLike/AddLikeResponseEntity.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.addLike + +data class AddLikeResponseEntity( + val id: Int, + val liked: Int, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitRequestEntity.kt new file mode 100644 index 0000000..85c311f --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitRequestEntity.kt @@ -0,0 +1,11 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.appInit + +data class AppInitRequestEntity( + val api_key: String, + val cmd: String, + val lang: String, + val platform: String, + val utc: Int, + val uuid: String, + val version: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitResponseEntity.kt new file mode 100644 index 0000000..563bc0b --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitResponseEntity.kt @@ -0,0 +1,14 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.appInit + +data class AppInitResponseEntity( + val addr: String, + val favorites: List, + val lat: Double, + val latest: String, + val login: String, + val lon: Double, + val timestamp: Int, + val types: List, + val url: String, + val vip: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitTypeEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitTypeEntity.kt new file mode 100644 index 0000000..d04303b --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/appInit/AppInitTypeEntity.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.appInit + +data class AppInitTypeEntity( + val name: String, + val type: Int, + val unit: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/bugReport/BugReportRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/bugReport/BugReportRequestEntity.kt new file mode 100644 index 0000000..bb3fabb --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/bugReport/BugReportRequestEntity.kt @@ -0,0 +1,12 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.bugReport + +data class BugReportRequestEntity( + val api_key: String, + val cmd: String, + val email: String, + val logs: String, + val mess: String, + val name: String, + val time: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/disLike/DisLikeRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/disLike/DisLikeRequestEntity.kt new file mode 100644 index 0000000..0066457 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/disLike/DisLikeRequestEntity.kt @@ -0,0 +1,8 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.disLike + +data class DisLikeRequestEntity( + val api_key: String, + val cmd: String, + val id: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/disLike/DisLikeResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/disLike/DisLikeResponseEntity.kt new file mode 100644 index 0000000..4d863e2 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/disLike/DisLikeResponseEntity.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.disLike + +data class DisLikeResponseEntity( + val id: Int, + val liked: Int, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsDeviceEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsDeviceEntity.kt new file mode 100644 index 0000000..cab15fa --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsDeviceEntity.kt @@ -0,0 +1,12 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.mapBounds + +data class MapBoundsDeviceEntity( + val id: Int, + val lat: Double, + val lon: Double, + val name: String, + val time: Int, + val type: Int, + val unit: String, + val value: Double +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsRequestEntity.kt new file mode 100644 index 0000000..14b1dad --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsRequestEntity.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.mapBounds + +data class MapBoundsRequestEntity( + val api_key: String, + val bounds: List, + val cmd: String, + val lang: String, + val limit: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsResponseEntity.kt new file mode 100644 index 0000000..b14d742 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsResponseEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.mapBounds + +data class MapBoundsResponseEntity( + val devices: List, + val webcams: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsWebcamEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsWebcamEntity.kt new file mode 100644 index 0000000..3a3f613 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/mapBounds/MapBoundsWebcamEntity.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.mapBounds + +data class MapBoundsWebcamEntity( + val id: Int, + val image: String, + val lat: Double, + val lon: Double, + val name: String, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/nameSensor/NameSensorRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/nameSensor/NameSensorRequestEntity.kt new file mode 100644 index 0000000..3dc5ebe --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/nameSensor/NameSensorRequestEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.nameSensor + +data class NameSensorRequestEntity( + val api_key: String, + val cmd: String, + val id: Int, + val name: String, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/pubSensor/PubSensorRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/pubSensor/PubSensorRequestEntity.kt new file mode 100644 index 0000000..024c610 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/pubSensor/PubSensorRequestEntity.kt @@ -0,0 +1,8 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.pubSensor + +data class PubSensorRequestEntity( + val api_key: String, + val cmd: String, + val id: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/pubSensor/PubSensorResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/pubSensor/PubSensorResponseEntity.kt new file mode 100644 index 0000000..ea4a731 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/pubSensor/PubSensorResponseEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.pubSensor + +data class PubSensorResponseEntity( + val code: Int, + val id: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendCommand/SendCommandRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendCommand/SendCommandRequestEntity.kt new file mode 100644 index 0000000..a57b0ca --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendCommand/SendCommandRequestEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sendCommand + +data class SendCommandRequestEntity( + val api_key: String, + val cmd: String, + val command: String, + val id: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendComplaint/SendComplaintRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendComplaint/SendComplaintRequestEntity.kt new file mode 100644 index 0000000..ea19abe --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendComplaint/SendComplaintRequestEntity.kt @@ -0,0 +1,13 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sendComplaint + +data class SendComplaintRequestEntity( + val api_key: String, + val cmd: String, + val email: String, + val id: Int, + val name: String, + val problem: String, + val time: Int, + val uuid: String, + val value: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendMessage/SendMessageRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendMessage/SendMessageRequestEntity.kt new file mode 100644 index 0000000..376e59e --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sendMessage/SendMessageRequestEntity.kt @@ -0,0 +1,12 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sendMessage + +data class SendMessageRequestEntity( + val api_key: String, + val cmd: String, + val email: String, + val mess: String, + val name: String, + val subj: String, + val uid: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/HistoryDataEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/HistoryDataEntity.kt new file mode 100644 index 0000000..5b8d10b --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/HistoryDataEntity.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsHistory + +data class HistoryDataEntity( + val id: Int, + val time: Int, + val value: Double +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/HistorySensorEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/HistorySensorEntity.kt new file mode 100644 index 0000000..9552e72 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/HistorySensorEntity.kt @@ -0,0 +1,8 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsHistory + +data class HistorySensorEntity( + val id: Int, + val name: String, + val type: Int, + val unit: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/SensorsHistoryRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/SensorsHistoryRequestEntity.kt new file mode 100644 index 0000000..ae1cd97 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/SensorsHistoryRequestEntity.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsHistory + +data class SensorsHistoryRequestEntity( + val api_key: String, + val cmd: String, + val id: Int, + val offset: Int, + val period: String, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/SensorsHistoryResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/SensorsHistoryResponseEntity.kt new file mode 100644 index 0000000..d3290de --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsHistory/SensorsHistoryResponseEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsHistory + +data class SensorsHistoryResponseEntity( + val `data`: List, + val sensors: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/NearbyDeviceEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/NearbyDeviceEntity.kt new file mode 100644 index 0000000..3966c5b --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/NearbyDeviceEntity.kt @@ -0,0 +1,19 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsNearby + +import ru.nm17.narodmon.appNarodMonApiClient.entities.SensorEntity + + +data class NearbyDeviceEntity( + val cmd: Int, + val distance: Double, + val id: Int, + val lat: Double, + val location: String, + val lon: Double, + val mac: String, + val my: Int, + val name: String, + val owner: String, + val sensors: List, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/SensorsNearbyRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/SensorsNearbyRequestEntity.kt new file mode 100644 index 0000000..3f7b7a8 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/SensorsNearbyRequestEntity.kt @@ -0,0 +1,12 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsNearby + +data class SensorsNearbyRequestEntity( + val api_key: String, + val cmd: String, + val lang: String, + val lat: Double, + val lon: Double, + val radius: Int, + val types: List, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/SensorsNearbyResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/SensorsNearbyResponseEntity.kt new file mode 100644 index 0000000..1417fa2 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsNearby/SensorsNearbyResponseEntity.kt @@ -0,0 +1,5 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsNearby + +data class SensorsNearbyResponseEntity( + val devices: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorOnDeviceEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorOnDeviceEntity.kt new file mode 100644 index 0000000..3c223f2 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorOnDeviceEntity.kt @@ -0,0 +1,19 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsOnDevice + +import ru.nm17.narodmon.ui.entities.SensorEntity + +data class SensorOnDeviceEntity( + val cmd: Int, + val distance: Double, + val id: Int, + val info: String, + val location: String, + val mac: String, + val my: Int, + val name: String, + val owner: String, + val photo: String, + val sensors: List, + val site: String, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorsOnDeviceRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorsOnDeviceRequestEntity.kt new file mode 100644 index 0000000..1c9a0ca --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorsOnDeviceRequestEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsOnDevice + +data class SensorsOnDeviceRequestEntity( + val api_key: String, + val cmd: String, + val devices: List, + val lang: String, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorsOnDeviceResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorsOnDeviceResponseEntity.kt new file mode 100644 index 0000000..7ca1537 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsOnDevice/SensorsOnDeviceResponseEntity.kt @@ -0,0 +1,5 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsOnDevice + +data class SensorsOnDeviceResponseEntity( + val devices: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorValueEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorValueEntity.kt new file mode 100644 index 0000000..2a26c28 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorValueEntity.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsValues + +data class SensorValueEntity( + val changed: Int, + val id: Int, + val time: Int, + val trend: Int, + val type: Int, + val value: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorsValuesRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorsValuesRequestEntity.kt new file mode 100644 index 0000000..1d0315f --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorsValuesRequestEntity.kt @@ -0,0 +1,8 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsValues + +data class SensorsValuesRequestEntity( + val api_key: String, + val cmd: String, + val sensors: List, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorsValuesResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorsValuesResponseEntity.kt new file mode 100644 index 0000000..36242aa --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/sensorsValues/SensorsValuesResponseEntity.kt @@ -0,0 +1,5 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.sensorsValues + +data class SensorsValuesResponseEntity( + val sensors: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/FavoriteSensorEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/FavoriteSensorEntity.kt new file mode 100644 index 0000000..6bb7817 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/FavoriteSensorEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userFavorites + +data class FavoriteSensorEntity( + val id: Int, + val name: String, + val time: Int, + val type: Int, + val value: Double +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/FavoriteWebcamEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/FavoriteWebcamEntity.kt new file mode 100644 index 0000000..68157b6 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/FavoriteWebcamEntity.kt @@ -0,0 +1,8 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userFavorites + +data class FavoriteWebcamEntity( + val id: Int, + val image: String, + val name: String, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/UserFavoritesRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/UserFavoritesRequestEntity.kt new file mode 100644 index 0000000..a5a536f --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/UserFavoritesRequestEntity.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userFavorites + +data class UserFavoritesRequestEntity( + val api_key: String, + val cmd: String, + val lang: String, + val sensors: List, + val uuid: String, + val webcams: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/UserFavoritesResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/UserFavoritesResponseEntity.kt new file mode 100644 index 0000000..8371cfc --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userFavorites/UserFavoritesResponseEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userFavorites + +data class UserFavoritesResponseEntity( + val sensors: List, + val webcams: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/CellEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/CellEntity.kt new file mode 100644 index 0000000..a5e1a74 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/CellEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLocation + +data class CellEntity( + val bssid: String, + val rssi: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByAddrRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByAddrRequestEntity.kt new file mode 100644 index 0000000..aacfd3a --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByAddrRequestEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLocation + +data class UserLocationByAddrRequestEntity( + val addr: String, + val api_key: String, + val cmd: String, + val lang: String, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByCellRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByCellRequestEntity.kt new file mode 100644 index 0000000..8c61a53 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByCellRequestEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLocation + +data class UserLocationByCellRequestEntity( + val api_key: String, + val cells: List, + val cmd: String, + val lang: String, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByCoordRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByCoordRequestEntity.kt new file mode 100644 index 0000000..48e8b4c --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByCoordRequestEntity.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLocation + +data class UserLocationByCoordRequestEntity( + val api_key: String, + val cmd: String, + val lang: String, + val lat: Double, + val lon: Double, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByWifiRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByWifiRequestEntity.kt new file mode 100644 index 0000000..5c76ca2 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationByWifiRequestEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLocation + +data class UserLocationByWifiRequestEntity( + val api_key: String, + val cmd: String, + val lang: String, + val uuid: String, + val wifi: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationResponseEntity.kt new file mode 100644 index 0000000..aeddce1 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/UserLocationResponseEntity.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLocation + +data class UserLocationResponseEntity( + val addr: String, + val lat: Double, + val lon: Double +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/WifiEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/WifiEntity.kt new file mode 100644 index 0000000..6ea7e0b --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLocation/WifiEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLocation + +data class WifiEntity( + val bssid: String, + val rssi: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogon/UserLogonRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogon/UserLogonRequestEntity.kt new file mode 100644 index 0000000..b3a08c6 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogon/UserLogonRequestEntity.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLogon + +data class UserLogonRequestEntity( + val api_key: String, + val cmd: String, + val hash: String, + val lang: String, + val login: String, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogon/UserLogonResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogon/UserLogonResponseEntity.kt new file mode 100644 index 0000000..c93ba41 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogon/UserLogonResponseEntity.kt @@ -0,0 +1,8 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLogon + +data class UserLogonResponseEntity( + val login: String, + val tz: Int, + val uid: Int, + val vip: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogout/UserLogoutRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogout/UserLogoutRequestEntity.kt new file mode 100644 index 0000000..995411d --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogout/UserLogoutRequestEntity.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLogout + +data class UserLogoutRequestEntity( + val api_key: String, + val cmd: String, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogout/UserLogoutResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogout/UserLogoutResponseEntity.kt new file mode 100644 index 0000000..6a9974e --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/userLogout/UserLogoutResponseEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.userLogout + +data class UserLogoutResponseEntity( + val login: String, + val uid: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/weatherReport/WeatherReportRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/weatherReport/WeatherReportRequestEntity.kt new file mode 100644 index 0000000..2536fa5 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/weatherReport/WeatherReportRequestEntity.kt @@ -0,0 +1,14 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.weatherReport + +data class WeatherReportRequestEntity( + val api_key: String, + val cmd: String, + val humid: String, + val lang: String, + val lat: Double, + val lon: Double, + val press: String, + val temp: String, + val uuid: String, + val wind: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/weatherReport/WeatherReportResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/weatherReport/WeatherReportResponseEntity.kt new file mode 100644 index 0000000..2d2ea8a --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/weatherReport/WeatherReportResponseEntity.kt @@ -0,0 +1,5 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.weatherReport + +data class WeatherReportResponseEntity( + val result: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImageEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImageEntity.kt new file mode 100644 index 0000000..17b1dd9 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImageEntity.kt @@ -0,0 +1,6 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.webcamImages + +data class WebcamImageEntity( + val image: String, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImagesRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImagesRequestEntity.kt new file mode 100644 index 0000000..df1565e --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImagesRequestEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.webcamImages + +data class WebcamImagesRequestEntity( + val api_key: String, + val cmd: String, + val id: Int, + val limit: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImagesResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImagesResponseEntity.kt new file mode 100644 index 0000000..a94d70f --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamImages/WebcamImagesResponseEntity.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.webcamImages + +data class WebcamImagesResponseEntity( + val distance: Double, + val id: Int, + val images: List, + val location: String, + val name: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamNearbyEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamNearbyEntity.kt new file mode 100644 index 0000000..146a9b4 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamNearbyEntity.kt @@ -0,0 +1,15 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.webcamsNearby + +data class WebcamNearbyEntity( + val distance: Double, + val fav: Int, + val id: Int, + val image: String, + val lat: Double, + val location: String, + val lon: Double, + val my: Int, + val name: String, + val owner: String, + val time: Int +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamsNearbyRequestEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamsNearbyRequestEntity.kt new file mode 100644 index 0000000..cab52b4 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamsNearbyRequestEntity.kt @@ -0,0 +1,11 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.webcamsNearby + +data class WebcamsNearbyRequestEntity( + val api_key: String, + val cmd: String, + val lang: String, + val lat: Double, + val lon: Double, + val radius: Int, + val uuid: String +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamsResponseEntity.kt b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamsResponseEntity.kt new file mode 100644 index 0000000..f766e9c --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/appNarodMonApiClient/entities/webcamsNearby/WebcamsResponseEntity.kt @@ -0,0 +1,5 @@ +package ru.nm17.narodmon.appNarodMonApiClient.entities.webcamsNearby + +data class WebcamsResponseEntity( + val webcams: List +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/Font.kt b/app/src/main/java/ru/nm17/narodmon/ui/Font.kt new file mode 100644 index 0000000..a1c20f0 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/Font.kt @@ -0,0 +1,10 @@ +package ru.nm17.narodmon.ui + +import androidx.compose.ui.text.font.Font +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.font.FontWeight +import ru.nm17.narodmon.R + +val iosevkaFamily = FontFamily( + Font(R.font.iosevka, FontWeight.Medium) +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/Utils.kt b/app/src/main/java/ru/nm17/narodmon/ui/Utils.kt new file mode 100644 index 0000000..7b20986 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/Utils.kt @@ -0,0 +1,9 @@ +package ru.nm17.narodmon.ui + +fun String.toChipTitle(): String { + return if (length >= 20) { + this.slice(0..16) + ".." + } else { + this + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/AgreementDialog.kt b/app/src/main/java/ru/nm17/narodmon/ui/dialogs/AgreementDialog.kt similarity index 89% rename from app/src/main/java/ru/nm17/narodmon/ui/elements/AgreementDialog.kt rename to app/src/main/java/ru/nm17/narodmon/ui/dialogs/AgreementDialog.kt index c50a53f..0daf706 100644 --- a/app/src/main/java/ru/nm17/narodmon/ui/elements/AgreementDialog.kt +++ b/app/src/main/java/ru/nm17/narodmon/ui/dialogs/AgreementDialog.kt @@ -1,10 +1,7 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package ru.nm17.narodmon.ui.elements +package ru.nm17.narodmon.ui.dialogs -import android.content.Context -import android.content.Intent -import android.net.Uri import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.padding @@ -22,12 +19,13 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import androidx.activity.ComponentActivity import androidx.compose.ui.platform.LocalUriHandler -import androidx.core.content.ContextCompat.startActivity +import androidx.compose.ui.tooling.preview.Preview import ru.nm17.narodmon.R +import ru.nm17.narodmon.ui.theme.NarodMonTheme import kotlin.system.exitProcess +@OptIn(ExperimentalMaterial3Api::class) @Composable fun AgreementDialog(modifier: Modifier = Modifier, onClick: () -> Unit) { val uriHandler = LocalUriHandler.current @@ -40,7 +38,7 @@ fun AgreementDialog(modifier: Modifier = Modifier, onClick: () -> Unit) { Text(text = stringResource(id = R.string.agreement_dialog_text)) Divider(Modifier.padding(vertical = 8.dp)) ListItem( - headlineText = { + headlineContent = { Text( text = stringResource(id = R.string.privacy_policy), style = MaterialTheme.typography.titleSmall @@ -56,7 +54,7 @@ fun AgreementDialog(modifier: Modifier = Modifier, onClick: () -> Unit) { ) ListItem( - headlineText = { + headlineContent = { Text( text = stringResource(id = R.string.user_agreement), style = MaterialTheme.typography.titleSmall @@ -87,4 +85,14 @@ fun AgreementDialog(modifier: Modifier = Modifier, onClick: () -> Unit) { modifier = modifier ) +} + +@Preview +@Composable +fun PreviewAgreementDialog(){ + NarodMonTheme { + AgreementDialog { + + } + } } \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/dialogs/FilterSensorsDialog.kt b/app/src/main/java/ru/nm17/narodmon/ui/dialogs/FilterSensorsDialog.kt new file mode 100644 index 0000000..cd07cff --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/dialogs/FilterSensorsDialog.kt @@ -0,0 +1,127 @@ +package ru.nm17.narodmon.ui.dialogs + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.AlertDialogDefaults +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import ru.nm17.narodmon.R +import ru.nm17.narodmon.ui.elements.FilterCheckbox +import ru.nm17.narodmon.ui.entities.SensorFilterUiEntity +import ru.nm17.narodmon.ui.theme.NarodMonTheme + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun FilterSensorsDialog( + onApply: (filters: List) -> Unit, + onDismissRequest: () -> Unit +) { + val filterItems = remember { + listOf( + /* TODO: + * Заменить `code` на настоящее значение + * либо динамически его подгружать из ответа АПИ + * (см. /appInit, ключ в жсоне: types.type) */ + SensorFilterUiEntity(R.string.filter_temp, 0), + SensorFilterUiEntity(R.string.filter_temp_water, 1), + SensorFilterUiEntity(R.string.filter_temp_ground, 2), + SensorFilterUiEntity(R.string.filter_temp_dew_point, 3), + SensorFilterUiEntity(R.string.filter_humidity, 4), + SensorFilterUiEntity(R.string.filter_pressure, 5), + SensorFilterUiEntity(R.string.filter_lightness, 6), + SensorFilterUiEntity(R.string.filter_uv, 7), + SensorFilterUiEntity(R.string.filter_radiation, 8), + SensorFilterUiEntity(R.string.filter_rainfall, 9), + SensorFilterUiEntity(R.string.filter_dust, 10), + SensorFilterUiEntity(R.string.filter_wind_speed, 11), + SensorFilterUiEntity(R.string.filter_wind_direction, 12), + SensorFilterUiEntity(R.string.filter_concentration, 13), + SensorFilterUiEntity(R.string.filter_power, 14), + SensorFilterUiEntity(R.string.filter_voltage, 15), + SensorFilterUiEntity(R.string.filter_amperage, 16), + SensorFilterUiEntity(R.string.filter_energy, 17), + SensorFilterUiEntity(R.string.filter_battery, 18), + SensorFilterUiEntity(R.string.filter_rxtx, 19), + SensorFilterUiEntity(R.string.filter_signal, 20), + SensorFilterUiEntity(R.string.filter_water_meter, 21), + SensorFilterUiEntity(R.string.filter_time, 22), + ) + } + + + AlertDialog( + onDismissRequest = { + onDismissRequest.invoke() + }) { + Surface( + shape = MaterialTheme.shapes.large, + tonalElevation = AlertDialogDefaults.TonalElevation + ) { + Column(modifier = Modifier.padding(vertical = 16.dp)) { + Text( + text = stringResource(id = R.string.sensors_filter_title), + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center, + modifier = Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth() + ) + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .heightIn(128.dp, 312.dp) + .padding(horizontal = 4.dp), + ) { + items(filterItems) { + FilterCheckbox( + checked = it.enabled.value, + stringRes = it.stringRes, + ) { it.enabled.value = !it.enabled.value } + } + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.End + ) { + TextButton(onClick = { onDismissRequest.invoke() }) { + Text(text = "Отмена") + } + Spacer(modifier = Modifier.padding(horizontal = 8.dp)) + Button(onClick = { onApply.invoke(filterItems) }) { + Text(text = stringResource(id = R.string.apply)) + } + } + } + + } + } +} + +@Preview +@Composable +fun PreviewFilterSensorsDialog() { + NarodMonTheme { + FilterSensorsDialog({}) {} + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/dialogs/SortSensorsDialog.kt b/app/src/main/java/ru/nm17/narodmon/ui/dialogs/SortSensorsDialog.kt new file mode 100644 index 0000000..eb0f74e --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/dialogs/SortSensorsDialog.kt @@ -0,0 +1,122 @@ +package ru.nm17.narodmon.ui.dialogs + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.wrapContentHeight +import androidx.compose.foundation.layout.wrapContentWidth +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.material3.AlertDialog +import androidx.compose.material3.AlertDialogDefaults +import androidx.compose.material3.Button +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.material3.TextButton +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.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import ru.nm17.narodmon.R +import ru.nm17.narodmon.ui.elements.FilterRadioButton +import ru.nm17.narodmon.ui.entities.SensorSortingUiEntity +import ru.nm17.narodmon.ui.entities.SortingTypes +import ru.nm17.narodmon.ui.theme.NarodMonTheme + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SortSensorsDialog( + selected: SensorSortingUiEntity, + sortingTypes: List? = null, + onApply: (sortingType: SensorSortingUiEntity) -> Unit, + onDismissRequest: () -> Unit +) { + var selectedType by remember { + mutableStateOf(selected) + } + val sensorsSortingTypes = listOf( + SensorSortingUiEntity(R.string.sort_by_name, SortingTypes.NAME), + SensorSortingUiEntity(R.string.sort_by_name_desc, SortingTypes.NAME_DESC), + SensorSortingUiEntity(R.string.sort_by_distance, SortingTypes.DISTANCE), + SensorSortingUiEntity(R.string.sort_by_distance_desc, SortingTypes.DISTANCE_DESC), + SensorSortingUiEntity(R.string.sort_by_type, SortingTypes.TYPE), + SensorSortingUiEntity(R.string.sort_by_type_desc, SortingTypes.TYPE_DESC), + SensorSortingUiEntity(R.string.sort_update_time, SortingTypes.UPD_TIME), + ) + + + + + AlertDialog( + onDismissRequest = { + onDismissRequest.invoke() + }) { + Surface( + modifier = Modifier + .wrapContentWidth() + .wrapContentHeight(), + shape = MaterialTheme.shapes.large, + tonalElevation = AlertDialogDefaults.TonalElevation + ) { + Column(modifier = Modifier.padding(vertical = 16.dp)) { + Text( + text = stringResource(id = R.string.sensors_sort_title), + style = MaterialTheme.typography.titleLarge, + textAlign = TextAlign.Center, + modifier = Modifier + .padding(horizontal = 16.dp) + .fillMaxWidth() + ) + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 4.dp), + ) { + items(sortingTypes ?: sensorsSortingTypes) { + FilterRadioButton( + selected = (selectedType == it), + onClick = { selectedType = it }, + stringRes = it.stringRes, + ) + } + } + Row( + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + horizontalArrangement = Arrangement.End + ) { + TextButton(onClick = { onDismissRequest.invoke() }) { + Text(text = "Отмена") + } + Spacer(modifier = Modifier.padding(horizontal = 8.dp)) + Button(onClick = { onApply.invoke(selectedType) }) { + Text(text = stringResource(id = R.string.apply)) + } + } + } + + } + } +} + +@Preview +@Composable +fun SortSensorsPreview() { + NarodMonTheme { + SortSensorsDialog( + SensorSortingUiEntity(R.string.sort_by_distance, SortingTypes.DISTANCE), + onApply = {}) {} + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/FilterCheckbox.kt b/app/src/main/java/ru/nm17/narodmon/ui/elements/FilterCheckbox.kt new file mode 100644 index 0000000..5f39e69 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/elements/FilterCheckbox.kt @@ -0,0 +1,31 @@ +package ru.nm17.narodmon.ui.elements + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.Checkbox +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource + +@ExperimentalMaterial3Api +@Composable +fun FilterCheckbox(checked: Boolean, stringRes: Int, onCheckedChange: () -> Unit) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .clickable { onCheckedChange() } + ) { + Checkbox( + checked = checked, + onCheckedChange = { onCheckedChange() }, + ) + Text( + text = stringResource(id = stringRes), + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/FilterRadioButton.kt b/app/src/main/java/ru/nm17/narodmon/ui/elements/FilterRadioButton.kt new file mode 100644 index 0000000..86d90a4 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/elements/FilterRadioButton.kt @@ -0,0 +1,29 @@ +package ru.nm17.narodmon.ui.elements + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.RadioButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource + +@ExperimentalMaterial3Api +@Composable +fun FilterRadioButton(selected: Boolean, onClick: () -> Unit, stringRes: Int) { + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .fillMaxWidth() + .clickable { onClick.invoke() } + ) { + RadioButton( + selected = selected, + onClick = onClick, + ) + Text(text = stringResource(id = stringRes)) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/Scaffolds.kt b/app/src/main/java/ru/nm17/narodmon/ui/elements/Scaffolds.kt index 72709c1..0c09c86 100644 --- a/app/src/main/java/ru/nm17/narodmon/ui/elements/Scaffolds.kt +++ b/app/src/main/java/ru/nm17/narodmon/ui/elements/Scaffolds.kt @@ -47,7 +47,7 @@ import kotlinx.coroutines.launch @Composable fun GenericNavScaffold(title: @Composable () -> Unit, content: @Composable (PaddingValues) -> Unit) { val expanded = rememberDrawerState(initialValue = DrawerValue.Closed) - val coScope = rememberCoroutineScope(); + val coScope = rememberCoroutineScope() val navController = rememberNavController() // TODO: Используй меня LaunchedEffect(key1 = Unit) { @@ -60,7 +60,7 @@ fun GenericNavScaffold(title: @Composable () -> Unit, content: @Composable (Padd leadingContent = { Icon(Icons.Default.AccountCircle, contentDescription = "") }, - headlineText = { Text(text = "Гость", style = MaterialTheme.typography.titleLarge)}, + headlineContent = { Text(text = "Гость", style = MaterialTheme.typography.titleLarge)}, modifier = Modifier.height(72.dp) ) Divider() @@ -75,29 +75,27 @@ fun GenericNavScaffold(title: @Composable () -> Unit, content: @Composable (Padd } }) { Scaffold( - topBar = { - TopAppBar( - title = title, - colors = TopAppBarDefaults.largeTopAppBarColors( - containerColor = MaterialTheme.colorScheme.primaryContainer - ), - navigationIcon = { - IconButton(onClick = { coScope.launch { expanded.open() } }) { - Icon(Icons.Filled.Menu, contentDescription = null) - } - }, - ) - }, - floatingActionButtonPosition = FabPosition.End, - floatingActionButton = { - FloatingActionButton(onClick = {}) { - Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon") - } - }, - //drawerContent = { Text(text = "Drawer Menu 1") }, - content = content, - + topBar = { + TopAppBar( + title = title, + colors = TopAppBarDefaults.largeTopAppBarColors( + containerColor = MaterialTheme.colorScheme.primaryContainer + ), + navigationIcon = { + IconButton(onClick = { coScope.launch { expanded.open() } }) { + Icon(Icons.Filled.Menu, contentDescription = null) + } + }, ) + }, + floatingActionButtonPosition = FabPosition.End, + floatingActionButton = { + FloatingActionButton(onClick = {}) { + Icon(imageVector = Icons.Default.Add, contentDescription = "fab icon") + } + }, + //drawerContent = { Text(text = "Drawer Menu 1") }, + content = content, + ) } - } \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/SensorItem.kt b/app/src/main/java/ru/nm17/narodmon/ui/elements/SensorItem.kt new file mode 100644 index 0000000..8662d3f --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/elements/SensorItem.kt @@ -0,0 +1,56 @@ +package ru.nm17.narodmon.ui.elements + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.ElevatedCard +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ListItem +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.RectangleShape +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import ru.nm17.narodmon.ui.entities.SensorEntity +import ru.nm17.narodmon.ui.iosevkaFamily + +@ExperimentalMaterial3Api +@Composable +fun SensorItem(sensorEntity: SensorEntity) { + ListItem( + overlineContent = { Text(text = "${sensorEntity.deviceName} от ${sensorEntity.deviceOwner}") }, + headlineContent = { Text(text = sensorEntity.type.name) }, + supportingContent = { Text(text = sensorEntity.name) }, + trailingContent = { + Column( + horizontalAlignment = Alignment.End, + ) { + Text(text = "${sensorEntity.distance} km") + Spacer(modifier = Modifier.size(2.dp)) + ElevatedCard( + shape = RectangleShape, + ) { + Text( + text = "${sensorEntity.value} ${sensorEntity.unit}", + fontFamily = iosevkaFamily, + fontWeight = FontWeight.Medium, + fontSize = 14.sp, + modifier = Modifier.padding(horizontal = 3.dp, vertical = 1.dp) + ) + } + } + } + ) +} + +@OptIn(ExperimentalMaterial3Api::class) +@Preview +@Composable +fun PreviewSensorItem() { +// SensorItem(SensorEntity(0, Se)) +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/SettingsItem.kt b/app/src/main/java/ru/nm17/narodmon/ui/elements/SettingsItem.kt new file mode 100644 index 0000000..daf382f --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/elements/SettingsItem.kt @@ -0,0 +1,50 @@ +package ru.nm17.narodmon.ui.elements + +import androidx.annotation.StringRes +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material3.Icon +import androidx.compose.material3.Switch +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.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import ru.nm17.narodmon.R + +/** + * Кнопка, которая нужна для настроек. + * @param titleId Id заголовка кнопки + * @param leadingItem Заполнить, когда нужно вставить Composable перед заголовком(например [Icon], [FilterCheckbox] или [Switch] + */ +@Composable +fun SettingsItem( + @StringRes titleId: Int, + leadingItem: @Composable (() -> Unit)? = null, + onClick: () -> Unit = {} +) { + Row(modifier = Modifier.padding(16.dp)) { + if (leadingItem != null) { + leadingItem.invoke() + Spacer(modifier = Modifier.size(16.dp)) + } + Column(modifier = Modifier + .fillMaxWidth() + .clickable { onClick.invoke() }) { + Text(text = stringResource(id = titleId)) + } + } + +} + +@Preview(showBackground = true) +@Composable +fun PreviewSettingsItem() { + SettingsItem(R.string.about_app) {} +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/elements/TileMap.kt b/app/src/main/java/ru/nm17/narodmon/ui/elements/TileMap.kt new file mode 100644 index 0000000..15f479d --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/elements/TileMap.kt @@ -0,0 +1,61 @@ +package ru.nm17.narodmon.ui.elements + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import androidx.compose.ui.geometry.Offset +import io.ktor.client.HttpClient +import io.ktor.client.engine.okhttp.OkHttp +import io.ktor.client.request.get +import io.ktor.client.statement.bodyAsChannel +import io.ktor.utils.io.jvm.javaio.toInputStream +import ovh.plrapps.mapcompose.api.addLayer +import ovh.plrapps.mapcompose.api.onTouchDown +import ovh.plrapps.mapcompose.api.scale +import ovh.plrapps.mapcompose.api.setScroll +import ovh.plrapps.mapcompose.core.TileStreamProvider +import ovh.plrapps.mapcompose.ui.MapUI +import ovh.plrapps.mapcompose.ui.state.MapState +import java.io.InputStream + +const val mapSize = 32768 + +val client = HttpClient(OkHttp) +val tileStreamProvider = TileStreamProvider { row, col, zoom -> + requestTile(row, col, zoom) +} + +suspend fun requestTile(row: Int, col: Int, zoom: Int): InputStream { + val response = client.get("https://tile.openstreetmap.org/${zoom}/${col}/${row}.png") + return response.bodyAsChannel().toInputStream() +} + +@Composable +fun TileMap(modifier: Modifier = Modifier, onTap: () -> Unit) { + val state by remember { + mutableStateOf( + MapState( + levelCount = 8, + fullWidth = mapSize, + fullHeight = mapSize, + workerCount = 16, + ).apply { + addLayer(tileStreamProvider) + onTouchDown { + onTap.invoke() + } + } + ) + } + + LaunchedEffect(state) { + // TODO: Подгружать сохранённую позицию + state.setScroll(Offset(28702.6F, 14787.6F)) + state.scale = 1.4658884F + } + + MapUI(modifier = modifier, state = state) +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorEntity.kt b/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorEntity.kt new file mode 100644 index 0000000..84aeb23 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorEntity.kt @@ -0,0 +1,21 @@ +package ru.nm17.narodmon.ui.entities + +import ru.nm17.narodmon.db.entities.SensorType + + +data class SensorEntity( + // TODO: Вынести в отдельный класс, и явно не в директорию `ui` + val id: Int, + val type: SensorType, + val deviceName: String, + val deviceOwner: Int, + val name: String, + val favorite: Boolean, + val public: Boolean, + val mine: Boolean, + val location: String, + val distance: Double, // километры + val value: Double, + val unit: String, + val changed: Int, +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorFilterUiEntity.kt b/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorFilterUiEntity.kt new file mode 100644 index 0000000..62277d8 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorFilterUiEntity.kt @@ -0,0 +1,11 @@ +package ru.nm17.narodmon.ui.entities + +import androidx.compose.runtime.MutableState +import androidx.compose.runtime.mutableStateOf + +data class SensorFilterUiEntity( + // TODO: Можно попробовать объединить с db/SensorType.kt + val stringRes: Int, + val code: Int, + var enabled: MutableState = mutableStateOf(false), +) diff --git a/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorSortingUiEntity.kt b/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorSortingUiEntity.kt new file mode 100644 index 0000000..96e4604 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/entities/SensorSortingUiEntity.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.ui.entities + + +data class SensorSortingUiEntity( + val stringRes: Int, + val sortingType: SortingTypes, +) \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/entities/SortingSensorsEntity.kt b/app/src/main/java/ru/nm17/narodmon/ui/entities/SortingSensorsEntity.kt new file mode 100644 index 0000000..82e230c --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/entities/SortingSensorsEntity.kt @@ -0,0 +1 @@ +package ru.nm17.narodmon.ui.entities diff --git a/app/src/main/java/ru/nm17/narodmon/ui/entities/SortingTypesEnum.kt b/app/src/main/java/ru/nm17/narodmon/ui/entities/SortingTypesEnum.kt new file mode 100644 index 0000000..0cb7aa3 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/entities/SortingTypesEnum.kt @@ -0,0 +1,13 @@ +package ru.nm17.narodmon.ui.entities + +enum class SortingTypes { + DISTANCE, + DISTANCE_DESC, + TYPE, + TYPE_DESC, + UPD_TIME, + NAME, + NAME_DESC, + VALUE, + VALUE_DESC +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/messagesScreen/MessagesScreen.kt b/app/src/main/java/ru/nm17/narodmon/ui/messagesScreen/MessagesScreen.kt new file mode 100644 index 0000000..f2c8b8f --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/messagesScreen/MessagesScreen.kt @@ -0,0 +1,16 @@ +package ru.nm17.narodmon.ui.messagesScreen + +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview + +@Composable +fun MessagesScreen() { + Text(text = "todo") +} + +@Preview +@Composable +fun PreviewMessagesScreen() { + MessagesScreen() +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/navHost/AppNavHost.kt b/app/src/main/java/ru/nm17/narodmon/ui/navHost/AppNavHost.kt new file mode 100644 index 0000000..9697fa4 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/navHost/AppNavHost.kt @@ -0,0 +1,30 @@ +package ru.nm17.narodmon.ui.navHost + +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.runtime.Composable +import androidx.compose.ui.tooling.preview.Preview +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import ru.nm17.narodmon.ui.settings.SettingsNavigation + + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun AppNavHost() { + val navController = rememberNavController() + NavHost(navController = navController, startDestination = "main") { + composable("main") { + MainScreen(navController) + } + composable("settings") { + SettingsNavigation() + } + } +} + +@Preview +@Composable +fun PreviewAppNavHost() { + AppNavHost() +} diff --git a/app/src/main/java/ru/nm17/narodmon/ui/navHost/MainScreen.kt b/app/src/main/java/ru/nm17/narodmon/ui/navHost/MainScreen.kt new file mode 100644 index 0000000..d2569b2 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/navHost/MainScreen.kt @@ -0,0 +1,83 @@ +package ru.nm17.narodmon.ui.navHost + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Icon +import androidx.compose.material3.NavigationBar +import androidx.compose.material3.NavigationBarItem +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.navigation.NavController +import androidx.navigation.NavGraph.Companion.findStartDestination +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController +import ru.nm17.narodmon.ui.sensorsScreen.SensorsScreen +import ru.nm17.narodmon.ui.theme.NarodMonTheme +import ru.nm17.narodmon.ui.webCamsScreen.WebCamsScreen + + +val items = listOf( + MainScreenSealed.Sensors, + MainScreenSealed.Webcams, + MainScreenSealed.Messages +) + +@Composable +fun MainScreen(outerNavController: NavController) { + val navController = rememberNavController() + + Scaffold( + bottomBar = { + NavigationBar { + + items.forEach { screen -> + NavigationBarItem( + selected = navController.currentDestination?.route == screen.route, + onClick = { + navController.navigate(screen.route) { + popUpTo(navController.graph.findStartDestination().id) { + saveState = true + } + launchSingleTop = true + restoreState = true + } + }, + label = { Text(text = stringResource(id = screen.resourceId)) }, + icon = { + Icon( + painter = painterResource(id = screen.iconId), + contentDescription = "" + ) + }) + } + } + }, + modifier = Modifier.fillMaxSize() + ) { + NavHost( + navController, + startDestination = MainScreenSealed.Sensors.route, + Modifier.padding(it) + ) { + composable(MainScreenSealed.Sensors.route) { + SensorsScreen(outerNavController) + } + composable(MainScreenSealed.Webcams.route) { WebCamsScreen(navController) } + composable(MainScreenSealed.Messages.route) { } + } + } +} + +@Preview +@Composable +fun PreviewMainScreen() { + NarodMonTheme { + MainScreen(rememberNavController()) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/navHost/MainScreenSealed.kt b/app/src/main/java/ru/nm17/narodmon/ui/navHost/MainScreenSealed.kt new file mode 100644 index 0000000..89fcdde --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/navHost/MainScreenSealed.kt @@ -0,0 +1,18 @@ +package ru.nm17.narodmon.ui.navHost + +import androidx.annotation.DrawableRes +import androidx.annotation.StringRes +import ru.nm17.narodmon.R + +sealed class MainScreenSealed( + val route: String, + @StringRes val resourceId: Int, + @DrawableRes val iconId: Int +) { + object Sensors : MainScreenSealed("sensors", R.string.sensors_page_title, R.drawable.ic_home) + object Webcams : MainScreenSealed("webcams", R.string.webcams, R.drawable.ic_webcam) + + object Messages : MainScreenSealed("messages", R.string.messages, R.drawable.ic_message) + + object Settings : MainScreenSealed("settings", R.string.settings, R.drawable.ic_settings) +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/pages/Sensors.kt b/app/src/main/java/ru/nm17/narodmon/ui/pages/Sensors.kt deleted file mode 100644 index 6942361..0000000 --- a/app/src/main/java/ru/nm17/narodmon/ui/pages/Sensors.kt +++ /dev/null @@ -1,28 +0,0 @@ -package ru.nm17.narodmon.ui.pages - -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Divider -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.ModalDrawerSheet -import androidx.compose.material3.NavigationDrawerItem -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.AnnotatedString -import androidx.compose.ui.unit.dp -import androidx.navigation.NavController -import ru.nm17.narodmon.Greeting -import ru.nm17.narodmon.R -import ru.nm17.narodmon.ui.elements.GenericNavScaffold - -@ExperimentalMaterial3Api -@Composable -fun SensorsPage(navController: NavController) { - GenericNavScaffold( - title = { Text(text = stringResource(R.string.sensors_page_title))} - ) { - Greeting(name = "world", modifier = Modifier.padding(it)) - } -} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/sensorsScreen/SensorsScreen.kt b/app/src/main/java/ru/nm17/narodmon/ui/sensorsScreen/SensorsScreen.kt new file mode 100644 index 0000000..8ded59d --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/sensorsScreen/SensorsScreen.kt @@ -0,0 +1,260 @@ +package ru.nm17.narodmon.ui.sensorsScreen + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.LazyRow +import androidx.compose.foundation.lazy.items +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Settings +import androidx.compose.material.icons.rounded.Check +import androidx.compose.material3.BottomSheetScaffold +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.FilterChip +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.SearchBar +import androidx.compose.material3.SearchBarDefaults +import androidx.compose.material3.SheetValue +import androidx.compose.material3.Text +import androidx.compose.material3.rememberBottomSheetScaffoldState +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.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController +import ru.nm17.narodmon.R +import ru.nm17.narodmon.db.entities.SensorType +import ru.nm17.narodmon.ui.dialogs.FilterSensorsDialog +import ru.nm17.narodmon.ui.dialogs.SortSensorsDialog +import ru.nm17.narodmon.ui.elements.SensorItem +import ru.nm17.narodmon.ui.elements.TileMap +import ru.nm17.narodmon.ui.entities.SensorEntity +import ru.nm17.narodmon.ui.entities.SensorSortingUiEntity +import ru.nm17.narodmon.ui.entities.SortingTypes +import ru.nm17.narodmon.ui.navHost.MainScreenSealed +import ru.nm17.narodmon.ui.theme.NarodMonTheme +import ru.nm17.narodmon.ui.toChipTitle + + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SensorsScreen(outerNavController: NavController) { + + var searchQuery by remember { mutableStateOf("") } + var searchActive by remember { mutableStateOf(false) } + + val scaffoldState = rememberBottomSheetScaffoldState() + val sensorEntities = remember { + mutableListOf( + // TODO: загружать датчики с сервера. Этот список -- для макета + SensorEntity( + 0, + SensorType(0, "temp", "C"), + "device0", 0, + "sensor0", favorite = true, + public = true, mine = false, + "Москва", 0.4, + 20.0, "C", 1686142800, + ), + SensorEntity( + 1, + SensorType(4, "humidity", "%"), + "device1", 0, + "sensor1", favorite = true, + public = false, mine = false, + "Подмосковье", 1.1, + 39.0, "%", 1686142800, + ), + SensorEntity( + 2, + SensorType(11, "wind speed", "m/s"), + "device2", 1, + "sensor2", favorite = false, + public = true, mine = true, + "Москва", 0.01, + 3.2, "m/s", 1686142800, + ), + ) + } + + var filterShow by remember { mutableStateOf(false) } + var filterMine by remember { mutableStateOf(false) } + + var sortingShow by remember { mutableStateOf(false) } + var sortingType by remember { + mutableStateOf( + SensorSortingUiEntity(R.string.sort_by_distance, SortingTypes.DISTANCE) + ) + } + + var sheetHeight by remember { + mutableStateOf(SheetHeight.ExtraExpanded) + } + + BottomSheetScaffold(modifier = Modifier.fillMaxSize(), sheetPeekHeight = when (sheetHeight) { + SheetHeight.ExtraExpanded -> 256.dp + SheetHeight.Expanded -> 128.dp + SheetHeight.Hidden -> 0.dp + }, scaffoldState = scaffoldState, sheetContent = { + AnimatedVisibility(visible = scaffoldState.bottomSheetState.currentValue == SheetValue.Expanded) { + OutlinedTextField( + value = searchQuery, + onValueChange = { searchQuery = it }, + placeholder = { Text(stringResource(R.string.search)) }, + shape = SearchBarDefaults.inputFieldShape, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 8.dp, vertical = 8.dp) + ) + } + + LazyRow( + horizontalArrangement = Arrangement.spacedBy(12.dp, Alignment.CenterHorizontally), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = 16.dp), + ) { + item { + FilterChip( + selected = false, + onClick = { filterShow = true }, + leadingIcon = { + Icon( + painter = painterResource(id = R.drawable.ic_filter), + contentDescription = stringResource(id = R.string.sensors_filter) + ) + }, + trailingIcon = { +// Icon( +// Icons.Filled.ArrowDropDown, +// "", +// tint = MaterialTheme.colorScheme.onBackground +// ) + }, + + label = { Text(text = stringResource(R.string.sensors_filter)) }, + ) + } + item { + FilterChip(selected = sortingType.sortingType != SortingTypes.DISTANCE, + onClick = { sortingShow = true }, + leadingIcon = { + Icon( + painter = painterResource(id = R.drawable.ic_sort), + contentDescription = stringResource(id = R.string.sensors_sorting) + ) + }, + trailingIcon = { +// Icon( +// Icons.Filled.ArrowDropDown, +// "", +// tint = MaterialTheme.colorScheme.onBackground +// ) + }, + label = { + Text( + text = stringResource( + if (sortingType.sortingType == SortingTypes.DISTANCE) R.string.sensors_sorting + else sortingType.stringRes + ).toChipTitle(), + ) + }) + } + + item { + FilterChip( + selected = filterMine, + onClick = { filterMine = !filterMine }, + leadingIcon = { + if (filterMine) { + Icon( + Icons.Rounded.Check, contentDescription = "" + ) + } + }, + label = { Text(text = stringResource(R.string.sensors_mine)) }, + ) + } + } + + LazyColumn( + modifier = Modifier.fillMaxHeight(), + ) { + items(sensorEntities) { sensor -> + SensorItem(sensor) + } + } + }) { + Box(modifier = Modifier.fillMaxSize()) { + SearchBar( + query = searchQuery, + active = searchActive, + onActiveChange = { active -> + searchActive = active + sheetHeight = if (active) SheetHeight.Hidden else SheetHeight.ExtraExpanded + }, + onQueryChange = { query -> searchQuery = query }, + onSearch = { searchActive = false }, + placeholder = { Text(stringResource(R.string.search_sensors)) }, + trailingIcon = { + IconButton(onClick = { outerNavController.navigate(MainScreenSealed.Settings.route) }) { + Icon( + Icons.Outlined.Settings, + contentDescription = stringResource(R.string.settings) + ) + } + }, + modifier = Modifier + .fillMaxWidth() + .padding( + horizontal = if (!searchActive) 8.dp else 0.dp, + ) + ) {} + + TileMap( + modifier = Modifier.fillMaxSize() + ) { + sheetHeight = + SheetHeight.Expanded // TODO придумать, чтобы менялось на SheetHeight.ExtraExpanded после взаимодействия с картой + + } + } + } + if (sortingShow) { + SortSensorsDialog(sortingType, onApply = { + sortingType = it + sortingShow = false + }, onDismissRequest = { + sortingShow = false + }) + } + if (filterShow) { + FilterSensorsDialog(onApply = { + // TODO применение фильтров + filterShow = false + }, onDismissRequest = { filterShow = false }) + } +} + +@Preview +@Composable +fun PreviewNewSensors() { + NarodMonTheme { + SensorsScreen(rememberNavController()) + } +} diff --git a/app/src/main/java/ru/nm17/narodmon/ui/sensorsScreen/SheetHeight.kt b/app/src/main/java/ru/nm17/narodmon/ui/sensorsScreen/SheetHeight.kt new file mode 100644 index 0000000..1b2fe7c --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/sensorsScreen/SheetHeight.kt @@ -0,0 +1,7 @@ +package ru.nm17.narodmon.ui.sensorsScreen + +enum class SheetHeight { + ExtraExpanded, + Expanded, + Hidden +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/settings/Settings.kt b/app/src/main/java/ru/nm17/narodmon/ui/settings/Settings.kt new file mode 100644 index 0000000..6ff326e --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/settings/Settings.kt @@ -0,0 +1,12 @@ +package ru.nm17.narodmon.ui.settings + +import androidx.annotation.StringRes +import ru.nm17.narodmon.R + +sealed class Settings(val route: String, @StringRes val resourceId: Int) { + + object Main : Settings("settings_main", R.string.settings) + object AboutApp : Settings("settings_about_app", R.string.about_app) + + object Debug : Settings("settings_debug_menu", R.string.debug_menu) +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/settings/SettingsNavigation.kt b/app/src/main/java/ru/nm17/narodmon/ui/settings/SettingsNavigation.kt new file mode 100644 index 0000000..f8cc7a2 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/settings/SettingsNavigation.kt @@ -0,0 +1,39 @@ +package ru.nm17.narodmon.ui.settings + +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.material3.TopAppBar +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.navigation.compose.NavHost +import androidx.navigation.compose.composable +import androidx.navigation.compose.rememberNavController + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun SettingsNavigation() { + val navController = rememberNavController() + Scaffold(topBar = { + TopAppBar(title = { Text(text = navController.currentDestination?.route ?: "") }) + }) { + NavHost( + navController = navController, + startDestination = Settings.Main.route, + modifier = Modifier.padding(it) + ) { + composable(Settings.Main.route) { SettingsScreen(navController) } + composable(Settings.AboutApp.route) { } + composable(Settings.Debug.route) { } + } + + } +} + +@Preview +@Composable +fun PreviewSettingsNavigation() { + SettingsNavigation() +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/settings/SettingsScreen.kt b/app/src/main/java/ru/nm17/narodmon/ui/settings/SettingsScreen.kt new file mode 100644 index 0000000..fb75ba0 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/settings/SettingsScreen.kt @@ -0,0 +1,37 @@ +package ru.nm17.narodmon.ui.settings + +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController +import ru.nm17.narodmon.R +import ru.nm17.narodmon.ui.elements.SettingsItem +import ru.nm17.narodmon.ui.theme.NarodMonTheme + +@Composable +fun SettingsScreen(navController: NavController) { + LazyColumn(modifier = Modifier.fillMaxSize()) { + item { + SettingsItem(titleId = R.string.debug_menu) { + navController.navigate(Settings.Debug.route) + } + } + item { + SettingsItem(R.string.about_app) { + navController.navigate(Settings.AboutApp.route) + } + } + + } +} + +@Preview(showBackground = true, showSystemUi = false) +@Composable +fun PreviewSettingsScreen() { + NarodMonTheme { + SettingsScreen(rememberNavController()) + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/theme/Theme.kt b/app/src/main/java/ru/nm17/narodmon/ui/theme/Theme.kt index 666d520..4b5a002 100644 --- a/app/src/main/java/ru/nm17/narodmon/ui/theme/Theme.kt +++ b/app/src/main/java/ru/nm17/narodmon/ui/theme/Theme.kt @@ -10,15 +10,16 @@ import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.material3.lightColorScheme import androidx.compose.runtime.Composable import androidx.compose.runtime.SideEffect +import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalView import androidx.core.view.WindowCompat private val DarkColorScheme = darkColorScheme( - primary = Purple80, - secondary = PurpleGrey80, - tertiary = Pink80 + primary = Purple80, + secondary = PurpleGrey80, + tertiary = Pink80 ) private val LightColorScheme = lightColorScheme( @@ -26,23 +27,23 @@ private val LightColorScheme = lightColorScheme( secondary = PurpleGrey80, tertiary = Pink80 - /* Other default colors to override - background = Color(0xFFFFFBFE), - surface = Color(0xFFFFFBFE), - onPrimary = Color.White, - onSecondary = Color.White, - onTertiary = Color.White, - onBackground = Color(0xFF1C1B1F), - onSurface = Color(0xFF1C1B1F), - */ + /* Other default colors to override +background = Color(0xFFFFFBFE), +surface = Color(0xFFFFFBFE), +onPrimary = Color.White, +onSecondary = Color.White, +onTertiary = Color.White, +onBackground = Color(0xFF1C1B1F), +onSurface = Color(0xFF1C1B1F), +*/ ) @Composable fun NarodMonTheme( - darkTheme: Boolean = isSystemInDarkTheme(), - // Dynamic color is available on Android 12+ - dynamicColor: Boolean = true, - content: @Composable () -> Unit + darkTheme: Boolean = isSystemInDarkTheme(), + // Dynamic color is available on Android 12+ + dynamicColor: Boolean = true, + content: @Composable () -> Unit ) { val colorScheme = when { dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> { @@ -57,14 +58,16 @@ fun NarodMonTheme( if (!view.isInEditMode) { SideEffect { val window = (view.context as Activity).window - window.statusBarColor = colorScheme.primary.toArgb() - WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = darkTheme + WindowCompat.setDecorFitsSystemWindows(window, false) + window.statusBarColor = Color.Transparent.toArgb() + + WindowCompat.getInsetsController(window, view).isAppearanceLightStatusBars = !darkTheme } } MaterialTheme( - colorScheme = colorScheme, - typography = Typography, - content = content + colorScheme = colorScheme, + typography = Typography, + content = content ) } \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamItem.kt b/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamItem.kt new file mode 100644 index 0000000..1bf1928 --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamItem.kt @@ -0,0 +1,74 @@ +package ru.nm17.narodmon.ui.webCamsScreen + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Text +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.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.text.font.FontFamily +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi +import com.bumptech.glide.integration.compose.GlideImage +import ru.nm17.narodmon.ui.iosevkaFamily + +@OptIn(ExperimentalGlideComposeApi::class) +@Composable +fun WebCamItem(webCamEntity: WebCamUiEntity) { + Box( + modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp), + contentAlignment = Alignment.BottomStart + ) { + GlideImage( + model = webCamEntity.imageUrl, + contentDescription = webCamEntity.name, + contentScale = ContentScale.FillHeight, + modifier = Modifier + .clip(RoundedCornerShape(8.dp)) + .height(240.dp) + .fillMaxWidth() + ) + Row( + modifier = Modifier + .clip( + RoundedCornerShape(bottomEnd = 8.dp, bottomStart = 8.dp) + ) + .background(Color(0f, 0f, 0f, 0.55f)) + .padding(start = 16.dp, end = 16.dp, bottom = 12.dp, top = 8.dp), + verticalAlignment = Alignment.CenterVertically + ) { + Column { + Text( + text = webCamEntity.time, + color = Color.White, + fontFamily = iosevkaFamily + ) + Text( + text = webCamEntity.name, + color = Color.White, + maxLines = 1, + fontFamily = iosevkaFamily + ) + + } + Text( + text = "${webCamEntity.distance} км", + color = Color.White, + fontFamily = iosevkaFamily, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.End + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamUiEntity.kt b/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamUiEntity.kt new file mode 100644 index 0000000..e17a48e --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamUiEntity.kt @@ -0,0 +1,13 @@ +package ru.nm17.narodmon.ui.webCamsScreen + +import android.graphics.Bitmap +import androidx.compose.ui.graphics.ImageBitmap + +data class WebCamUiEntity( + val id: Int, + val name: String, + val distance: Int, + val location: String, + val time: String, + val imageUrl: String +) diff --git a/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamsScreen.kt b/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamsScreen.kt new file mode 100644 index 0000000..38a4a3a --- /dev/null +++ b/app/src/main/java/ru/nm17/narodmon/ui/webCamsScreen/WebCamsScreen.kt @@ -0,0 +1,62 @@ +package ru.nm17.narodmon.ui.webCamsScreen + +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.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.tooling.preview.Preview +import androidx.navigation.NavController +import androidx.navigation.compose.rememberNavController +import ru.nm17.narodmon.ui.theme.NarodMonTheme + +@Composable +fun WebCamsScreen(navController: NavController) { + + var webCams by remember { + mutableStateOf( + listOf( + WebCamUiEntity( + 1, + "Крутая камера", + 1, + "Улица Пушкина, дом Калатушкина, кватира под номером 5", + "12:45", + "https://images-webcams.windy.com/51/1559159251/current/preview/1559159251.jpg?1686320054" + ), + WebCamUiEntity( + 2, + "Крутая камера 2", + 2, + "Улица Пушкина, дом Калатушкина, кватира под номером 5", + "12:45", + "https://images-webcams.windy.com/51/1559159251/current/preview/1559159251.jpg?1686320054" + ), + WebCamUiEntity( + 3, + "Крутая камера 3", + 3, + "Улица Пушкина, дом Калатушкина, кватира под номером 5", + "12:45", + "https://images-webcams.windy.com/51/1559159251/current/preview/1559159251.jpg?1686320054" + ) + ) + ) + } // TODO источник камер + + LazyColumn() { + items(webCams) { + WebCamItem(webCamEntity = it) + } + } +} + +@Preview +@Composable +fun PreviewWebCams() { + NarodMonTheme { + WebCamsScreen(rememberNavController()) + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_filter.xml b/app/src/main/res/drawable/ic_filter.xml new file mode 100644 index 0000000..d574422 --- /dev/null +++ b/app/src/main/res/drawable/ic_filter.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_home.xml b/app/src/main/res/drawable/ic_home.xml new file mode 100644 index 0000000..3cdad40 --- /dev/null +++ b/app/src/main/res/drawable/ic_home.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_message.xml b/app/src/main/res/drawable/ic_message.xml new file mode 100644 index 0000000..dfb81a6 --- /dev/null +++ b/app/src/main/res/drawable/ic_message.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_settings.xml b/app/src/main/res/drawable/ic_settings.xml new file mode 100644 index 0000000..c624d19 --- /dev/null +++ b/app/src/main/res/drawable/ic_settings.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_sort.xml b/app/src/main/res/drawable/ic_sort.xml new file mode 100644 index 0000000..ed8927f --- /dev/null +++ b/app/src/main/res/drawable/ic_sort.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/ic_webcam.xml b/app/src/main/res/drawable/ic_webcam.xml new file mode 100644 index 0000000..a6fd65e --- /dev/null +++ b/app/src/main/res/drawable/ic_webcam.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/font/iosevka.ttf b/app/src/main/res/font/iosevka.ttf new file mode 100644 index 0000000..bab9e51 Binary files /dev/null and b/app/src/main/res/font/iosevka.ttf differ diff --git a/app/src/main/res/layout/fragment_sensors.xml b/app/src/main/res/layout/fragment_sensors.xml deleted file mode 100644 index e076d3b..0000000 --- a/app/src/main/res/layout/fragment_sensors.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 50cd33f..9e74ffa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -1,7 +1,6 @@ Народный Мониторинг - Hello blank fragment Я принимаю соглашения Выйти @@ -15,4 +14,48 @@ Примите необходимые соглашения Сенсоры Ожидаю соглашение пользователя + Поиск + Тип датчиков + Сортировка + Мои датчики + Температура точки росы + Температура воздуха + Температура воды + Температура почвы + Влажность + Давление + Освещённость + УФ-индекс + Радиация + Осадки + Запылённость + Скорость ветра + Направление ветра + Концентрация + Мощность + Напряжение + Сила тока + Энергия + % батареи + Rx/Tx трафик + Сигнал в dBm + Счётчик воды + Время работы + Тип датчиков + От ближних к дальним + По типу (от А до Я) + По типу (от Я до А) + По названию (от А до Я) + По названию (от Я до А) + Сортировка датчиков + По времени обновления + Применить + От дальних к ближним + Отменить + Веб-камеры + Сообщения + Настройки + Поиск датчиков + О приложении + Debug-меню \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index a952870..a1a48e8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -agp = "8.2.0-alpha06" +agp = "8.2.0-alpha07" kotlin = "1.8.10" core-ktx = "1.9.0" junit = "4.13.2"