diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 33b715e..efe4c41 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) + alias(libs.plugins.kotlin.serialization) } android { @@ -68,7 +69,7 @@ dependencies { debugImplementation(libs.androidx.compose.ui.test.manifest) implementation("androidx.compose.material:material-icons-extended:1.7.8") implementation("com.google.android.gms:play-services-location:21.3.0") - + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.0") // ArcGIS Maps for Kotlin - SDK dependency implementation(libs.arcgis.maps.kotlin) // Toolkit dependencies diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/ListViewModel.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/ListViewModel.kt new file mode 100644 index 0000000..351adf4 --- /dev/null +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/ListViewModel.kt @@ -0,0 +1,105 @@ +package de.jadehs.strassenschadenpro2 + +import android.app.Application +import androidx.lifecycle.AndroidViewModel +import androidx.lifecycle.viewModelScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext +import kotlinx.serialization.Serializable +import kotlinx.serialization.json.Json +import java.net.HttpURLConnection +import java.net.URL + +class ListViewModel(application: Application): AndroidViewModel(application) { + + private val _features = MutableStateFlow>(emptyList()) + val features: StateFlow> = _features + + fun fetch() { + viewModelScope.launch { + try { + val data = + loadFeatures("https://services9.arcgis.com/UVxdrlZq3S3gqt7w/ArcGIS/rest/services/StrassenSchaeden/FeatureServer/0/query?where=1%3D1&objectIds=&geometry=&geometryType=esriGeometryEnvelope&inSR=&spatialRel=esriSpatialRelIntersects&resultType=none&distance=0.0&units=esriSRUnit_Meter&outDistance=&relationParam=&returnGeodetic=false&outFields=OBJECTID%2Ctyp%2Cbeschreibung&returnGeometry=true&featureEncoding=esriDefault&multipatchOption=xyFootprint&maxAllowableOffset=&geometryPrecision=&outSR=&defaultSR=&datumTransformation=&applyVCSProjection=false&returnIdsOnly=false&returnUniqueIdsOnly=false&returnCountOnly=false&returnExtentOnly=false&returnQueryGeometry=false&returnDistinctValues=false&cacheHint=false&collation=&orderByFields=&groupByFieldsForStatistics=&returnAggIds=false&outStatistics=&having=&resultOffset=&resultRecordCount=&returnZ=false&returnM=false&returnTrueCurves=false&returnExceededLimitFeatures=true&quantizationParameters=&sqlFormat=none&f=pgeojson&token=") + _features.value = data.features + } catch (e: Exception){ + e.printStackTrace() + } + } + + } + + suspend fun loadFeatures(url: String): FeatureCollection { + val jsonParser = Json { ignoreUnknownKeys = true } + val jsonText = loadJsonFromUrl(url) + return jsonParser.decodeFromString(jsonText) + } + + suspend fun loadJsonFromUrl(urlString: String): String{ + return withContext(Dispatchers.IO){ + val url = URL(urlString) + val conn = url.openConnection() as HttpURLConnection + conn.requestMethod = "GET" + conn.connectTimeout = 5000 + conn.readTimeout = 5000 + + try { + val stream = conn.inputStream + stream.bufferedReader().use { it.readText() } + } finally { + conn.disconnect() + } + } + } +} + +@Serializable +data class FeatureCollection( + val type: String? = null, + val features: List = emptyList() +) + +@Serializable +data class Feature( + val type: String? = null, + val id: Int? = null, + val geometry: Geometry? = null, + val properties: Properties? = null +) + +@Serializable +data class Geometry( + val type: String? = null, + val coordinates: List = emptyList() +) + +@Serializable +data class Properties( + val OBJECTID: Int? = null, + val Typ: String? = null, + val Beschreibung: String? = null +) + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt index 4b8fbd7..a105c9a 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt @@ -59,10 +59,11 @@ fun MainScreen(modifier: Modifier = Modifier, application: Application) { @Composable fun ContentScreen(modifier: Modifier = Modifier, selectedIndex: Int, application: Application) { val mapViewModel = remember { MapViewModel(application) } + val listViewModel = remember { ListViewModel(application) } when(selectedIndex) { 0 -> MapPage(modifier = modifier, mapViewModel = mapViewModel) 1 -> CreatePage(modifier = modifier, mapViewModel = mapViewModel) - 2 -> ListPage() + 2 -> ListPage(modifier = modifier, listViewModel = listViewModel) 3 -> SettingsPage() } } \ No newline at end of file diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/CreatePage.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/CreatePage.kt index da56c43..a59b036 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/CreatePage.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/CreatePage.kt @@ -131,7 +131,11 @@ fun CreatePage(modifier: Modifier = Modifier, mapViewModel: MapViewModel) { location.latitude, SpatialReference.wgs84()) val photoDataList = getPhotosFromAlbum(context,albumViewModel) - mapViewModel.createFeatureWithAttributesAtPoint(point,beschreibung,typ,photoDataList) + mapViewModel.createFeatureWithAttributesAtPoint( + point, + beschreibung, + typ, + photoDataList) } } }){ diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt index 75fb157..bed31d0 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/ListPage.kt @@ -1,10 +1,20 @@ package de.jadehs.strassenschadenpro2.pages +import android.util.Log import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier +import de.jadehs.strassenschadenpro2.ListViewModel @Composable -fun ListPage(modifier: Modifier = Modifier) { +fun ListPage(modifier: Modifier = Modifier, listViewModel: ListViewModel) { + val features = listViewModel.features.collectAsState() + LaunchedEffect(Unit) { + listViewModel.fetch() + Log.d("test",""+features.value.size) + } + Text("Liste") } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 04132ab..7a0bd86 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -35,4 +35,5 @@ arcgis-maps-kotlin-toolkit-authentication = { group = "com.esri", name = "arcgis android-application = { id = "com.android.application", version.ref = "agp" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +kotlin-serialization = { id="org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin"}