Zeige Notification
This commit is contained in:
@@ -3,18 +3,25 @@ package de.jadehs.strassenschadenpro2
|
|||||||
import android.app.NotificationChannel
|
import android.app.NotificationChannel
|
||||||
import android.app.NotificationManager
|
import android.app.NotificationManager
|
||||||
import android.app.Service
|
import android.app.Service
|
||||||
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.os.IBinder
|
import android.os.IBinder
|
||||||
import android.os.Looper
|
import android.os.Looper
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import androidx.core.app.NotificationCompat
|
import androidx.core.app.NotificationCompat
|
||||||
|
import androidx.core.app.NotificationManagerCompat
|
||||||
import com.google.android.gms.location.FusedLocationProviderClient
|
import com.google.android.gms.location.FusedLocationProviderClient
|
||||||
import com.google.android.gms.location.LocationCallback
|
import com.google.android.gms.location.LocationCallback
|
||||||
import com.google.android.gms.location.LocationRequest
|
import com.google.android.gms.location.LocationRequest
|
||||||
import com.google.android.gms.location.LocationResult
|
import com.google.android.gms.location.LocationResult
|
||||||
import com.google.android.gms.location.LocationServices
|
import com.google.android.gms.location.LocationServices
|
||||||
import com.google.android.gms.location.Priority
|
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() {
|
class LocationService: Service() {
|
||||||
|
|
||||||
@@ -36,11 +43,45 @@ class LocationService: Service() {
|
|||||||
for (location in locationResult.locations){
|
for (location in locationResult.locations){
|
||||||
val latitude = location.latitude
|
val latitude = location.latitude
|
||||||
val longitude = location.longitude
|
val longitude = location.longitude
|
||||||
|
val sharedPreferences=getSharedPreferences("settings", Context.MODE_PRIVATE)
|
||||||
|
val radius= sharedPreferences.getInt("radius", 50)
|
||||||
Log.e("LocationService", "Location: $latitude, $longitude")
|
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 {
|
override fun onStartCommand(intent: Intent?,flags: Int,startId: Int): Int {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
|
||||||
|
|||||||
@@ -87,6 +87,6 @@ fun ContentScreen(
|
|||||||
0 -> MapPage(modifier = modifier, mapViewModel = mapViewModel,selectedObjectId=selectedObjectId, onObjectIdUsed = onObjectIdUsed)
|
0 -> MapPage(modifier = modifier, mapViewModel = mapViewModel,selectedObjectId=selectedObjectId, onObjectIdUsed = onObjectIdUsed)
|
||||||
1 -> CreatePage(modifier = modifier, mapViewModel = mapViewModel)
|
1 -> CreatePage(modifier = modifier, mapViewModel = mapViewModel)
|
||||||
2 -> ListPage(modifier = modifier, listViewModel = listViewModel, onFeatureClick = onFeatureSelected)
|
2 -> ListPage(modifier = modifier, listViewModel = listViewModel, onFeatureClick = onFeatureSelected)
|
||||||
3 -> SettingsPage()
|
3 -> SettingsPage(modifier = modifier)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,89 @@
|
|||||||
package de.jadehs.strassenschadenpro2.pages
|
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.material3.Text
|
||||||
import androidx.compose.runtime.Composable
|
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.Modifier
|
||||||
|
import androidx.compose.ui.platform.LocalContext
|
||||||
|
import androidx.compose.ui.text.input.KeyboardType
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SettingsPage(modifier: Modifier = Modifier) {
|
fun SettingsPage(modifier: Modifier = Modifier) {
|
||||||
Text("Einstellungen")
|
|
||||||
|
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)
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
5
app/src/main/res/drawable/outline_adb_24.xml
Normal file
5
app/src/main/res/drawable/outline_adb_24.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:height="24dp" android:tint="#000000" android:viewportHeight="960" android:viewportWidth="960" android:width="24dp">
|
||||||
|
|
||||||
|
<path android:fillColor="@android:color/white" android:pathData="M200,440L200,400Q200,328 232.5,268.5Q265,209 320,171L245,96L280,60L365,145Q391,133 420.5,126.5Q450,120 480,120Q510,120 539.5,126.5Q569,133 595,145L680,60L715,96L640,171Q695,209 727.5,268.5Q760,328 760,400L760,440L200,440ZM600,360Q617,360 628.5,348.5Q640,337 640,320Q640,303 628.5,291.5Q617,280 600,280Q583,280 571.5,291.5Q560,303 560,320Q560,337 571.5,348.5Q583,360 600,360ZM360,360Q377,360 388.5,348.5Q400,337 400,320Q400,303 388.5,291.5Q377,280 360,280Q343,280 331.5,291.5Q320,303 320,320Q320,337 331.5,348.5Q343,360 360,360ZM480,920Q363,920 281.5,838.5Q200,757 200,640L200,480L760,480L760,640Q760,757 678.5,838.5Q597,920 480,920Z"/>
|
||||||
|
|
||||||
|
</vector>
|
||||||
Reference in New Issue
Block a user