From b75420415b5d368b6004cc64f30b7bcb9877c661 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Ahlers?= Date: Thu, 8 Jan 2026 11:13:05 +0100 Subject: [PATCH] Zeige Notification --- .../strassenschadenpro2/LocationService.kt | 41 +++++++++ .../jadehs/strassenschadenpro2/MainScreen.kt | 2 +- .../strassenschadenpro2/pages/SettingsPage.kt | 83 ++++++++++++++++++- app/src/main/res/drawable/outline_adb_24.xml | 5 ++ 4 files changed, 128 insertions(+), 3 deletions(-) create mode 100644 app/src/main/res/drawable/outline_adb_24.xml diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/LocationService.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/LocationService.kt index ac05288..52bc30b 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/LocationService.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/LocationService.kt @@ -3,18 +3,25 @@ package de.jadehs.strassenschadenpro2 import android.app.NotificationChannel import android.app.NotificationManager import android.app.Service +import android.content.Context import android.content.Intent import android.os.Build import android.os.IBinder import android.os.Looper import android.util.Log import androidx.core.app.NotificationCompat +import androidx.core.app.NotificationManagerCompat import com.google.android.gms.location.FusedLocationProviderClient import com.google.android.gms.location.LocationCallback import com.google.android.gms.location.LocationRequest import com.google.android.gms.location.LocationResult import com.google.android.gms.location.LocationServices import com.google.android.gms.location.Priority +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import org.json.JSONObject +import java.net.URL class LocationService: Service() { @@ -36,12 +43,46 @@ class LocationService: Service() { for (location in locationResult.locations){ val latitude = location.latitude val longitude = location.longitude + val sharedPreferences=getSharedPreferences("settings", Context.MODE_PRIVATE) + val radius= sharedPreferences.getInt("radius", 50) Log.e("LocationService", "Location: $latitude, $longitude") + CoroutineScope(Dispatchers.IO).launch { + val urlString = "https://services9.arcgis.com/UVxdrlZq3S3gqt7w/ArcGIS/rest/services/StrassenSchaeden/FeatureServer/0/query?where=1%3D1&objectIds=&geometry=$longitude%2C$latitude&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelIntersects&resultType=none&distance=$radius&units=esriSRUnit_Meter&outDistance=&relationParam=&returnGeodetic=false&outFields=&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=" + val jsonString = URL(urlString).readText() + val jsonObject = JSONObject(jsonString) + val features = jsonObject.getJSONArray("features") + val anzahl = features.length() + if (anzahl > 0){ + showNotification(this@LocationService, anzahl) + } + } } } } } + fun showNotification(context: Context, anzahl: Int){ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ + val serviceChannel = NotificationChannel( + channelID, + "Location Service Channel", + NotificationManager.IMPORTANCE_DEFAULT + ) + val manager = getSystemService(NotificationManager::class.java) + manager?.createNotificationChannel(serviceChannel) + + val notification = NotificationCompat.Builder(context, channelID) + .setContentTitle("Straßenschaden gefunden!") + .setContentText("$anzahl Strassenschäden gefunden!") + .setPriority(NotificationCompat.PRIORITY_DEFAULT) + .setSmallIcon(R.drawable.outline_adb_24) + .build() + with(NotificationManagerCompat.from(context)){ + notify(notificationID, notification) + } + } + } + override fun onStartCommand(intent: Intent?,flags: Int,startId: Int): Int { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ val serviceChannel = NotificationChannel( diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt index 7848f74..caa8ea2 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/MainScreen.kt @@ -87,6 +87,6 @@ fun ContentScreen( 0 -> MapPage(modifier = modifier, mapViewModel = mapViewModel,selectedObjectId=selectedObjectId, onObjectIdUsed = onObjectIdUsed) 1 -> CreatePage(modifier = modifier, mapViewModel = mapViewModel) 2 -> ListPage(modifier = modifier, listViewModel = listViewModel, onFeatureClick = onFeatureSelected) - 3 -> SettingsPage() + 3 -> SettingsPage(modifier = modifier) } } \ No newline at end of file diff --git a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/SettingsPage.kt b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/SettingsPage.kt index 2091e77..f2fc75c 100644 --- a/app/src/main/java/de/jadehs/strassenschadenpro2/pages/SettingsPage.kt +++ b/app/src/main/java/de/jadehs/strassenschadenpro2/pages/SettingsPage.kt @@ -1,10 +1,89 @@ package de.jadehs.strassenschadenpro2.pages +import android.content.Context +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Slider import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp @Composable fun SettingsPage(modifier: Modifier = Modifier) { - Text("Einstellungen") -} \ No newline at end of file + + val context = LocalContext.current + val sharedPreferences = remember { context.getSharedPreferences("settings", Context.MODE_PRIVATE) } + + var radius by remember { + mutableFloatStateOf(sharedPreferences.getInt("radius", 50).toFloat()) + } + + Column(modifier = modifier.padding(16.dp)) { + Text("Einstellungen", style = MaterialTheme.typography.headlineMedium) + Text("Suchradius (in Meter)",modifier = Modifier.padding(top=16.dp)) + + OutlinedTextField( + value = radius.toInt().toString(), + modifier = Modifier.padding(top=8.dp), + label = { Text("Radius") }, + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + onValueChange = { newValue -> + var textValue = newValue + textValue = textValue.replace(" ","") + textValue = textValue.filter { it.isDigit() } + val parsed = newValue.toIntOrNull() + if (parsed != null) { + val clamped = parsed.coerceIn(20, 500) + radius = clamped.toFloat() + sharedPreferences.edit().putInt("radius", clamped).apply() + } + }, + singleLine = true + ) + Slider( + value = radius, + onValueChange = { newValue -> + radius = newValue + sharedPreferences.edit().putInt("radius", newValue.toInt()).apply() + }, + valueRange = 20f..500f, + modifier = Modifier.padding(top=8.dp) + ) + } +} + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/drawable/outline_adb_24.xml b/app/src/main/res/drawable/outline_adb_24.xml new file mode 100644 index 0000000..5f84c3a --- /dev/null +++ b/app/src/main/res/drawable/outline_adb_24.xml @@ -0,0 +1,5 @@ + + + + +