Fix marge conflicts
This commit is contained in:
1
.idea/.name
generated
Normal file
1
.idea/.name
generated
Normal file
@@ -0,0 +1 @@
|
|||||||
|
CamionBasura
|
||||||
10
.idea/deploymentTargetSelector.xml
generated
10
.idea/deploymentTargetSelector.xml
generated
@@ -4,6 +4,16 @@
|
|||||||
<selectionStates>
|
<selectionStates>
|
||||||
<SelectionState runConfigName="app">
|
<SelectionState runConfigName="app">
|
||||||
<option name="selectionMode" value="DROPDOWN" />
|
<option name="selectionMode" value="DROPDOWN" />
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
<DropdownSelection timestamp="2026-05-23T03:25:21.703330800Z">
|
||||||
|
<Target type="DEFAULT_BOOT">
|
||||||
|
<handle>
|
||||||
|
<DeviceId pluginId="PhysicalDevice" identifier="serial=RFCW11GVGSV" />
|
||||||
|
</handle>
|
||||||
|
</Target>
|
||||||
|
</DropdownSelection>
|
||||||
|
>>>>>>> a80ea289fd32cc25c1aadbfa295b6f00b7b775f6
|
||||||
<DialogSelection />
|
<DialogSelection />
|
||||||
</SelectionState>
|
</SelectionState>
|
||||||
</selectionStates>
|
</selectionStates>
|
||||||
|
|||||||
3
.idea/gradle.xml
generated
3
.idea/gradle.xml
generated
@@ -1,6 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
|
<<<<<<< HEAD
|
||||||
<component name="GradleMigrationSettings" migrationVersion="1" />
|
<component name="GradleMigrationSettings" migrationVersion="1" />
|
||||||
|
=======
|
||||||
|
>>>>>>> a80ea289fd32cc25c1aadbfa295b6f00b7b775f6
|
||||||
<component name="GradleSettings">
|
<component name="GradleSettings">
|
||||||
<option name="linkedExternalProjectsSettings">
|
<option name="linkedExternalProjectsSettings">
|
||||||
<GradleProjectSettings>
|
<GradleProjectSettings>
|
||||||
|
|||||||
48
.kotlin/errors/errors-1779506747038.log
Normal file
48
.kotlin/errors/errors-1779506747038.log
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
kotlin version: 2.2.10
|
||||||
|
error message: java.io.IOException: Cannot run program "C:\Program Files\Android\Android Studio1\jbr\bin\java" (in directory "C:\Users\angel\AppData\Local\kotlin\daemon"): CreateProcess error=5, Acceso denegado
|
||||||
|
|
||||||
|
error message: Daemon compilation failed: Could not connect to Kotlin compile daemon
|
||||||
|
java.lang.RuntimeException: Could not connect to Kotlin compile daemon
|
||||||
|
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemon(GradleKotlinCompilerWork.kt:214)
|
||||||
|
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.compileWithDaemonOrFallbackImpl(GradleKotlinCompilerWork.kt:159)
|
||||||
|
at org.jetbrains.kotlin.compilerRunner.GradleKotlinCompilerWork.run(GradleKotlinCompilerWork.kt:111)
|
||||||
|
at org.jetbrains.kotlin.compilerRunner.GradleCompilerRunnerWithWorkers$GradleKotlinCompilerWorkAction.execute(GradleCompilerRunnerWithWorkers.kt:74)
|
||||||
|
at org.gradle.workers.internal.DefaultWorkerServer.execute(DefaultWorkerServer.java:68)
|
||||||
|
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:64)
|
||||||
|
at org.gradle.workers.internal.NoIsolationWorkerFactory$1$1.create(NoIsolationWorkerFactory.java:61)
|
||||||
|
at org.gradle.internal.classloader.ClassLoaderUtils.executeInClassloader(ClassLoaderUtils.java:102)
|
||||||
|
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.lambda$execute$0(NoIsolationWorkerFactory.java:61)
|
||||||
|
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:44)
|
||||||
|
at org.gradle.workers.internal.AbstractWorker$1.call(AbstractWorker.java:41)
|
||||||
|
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210)
|
||||||
|
at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205)
|
||||||
|
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67)
|
||||||
|
at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60)
|
||||||
|
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167)
|
||||||
|
at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60)
|
||||||
|
at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54)
|
||||||
|
at org.gradle.workers.internal.AbstractWorker.executeWrappedInBuildOperation(AbstractWorker.java:41)
|
||||||
|
at org.gradle.workers.internal.NoIsolationWorkerFactory$1.execute(NoIsolationWorkerFactory.java:58)
|
||||||
|
at org.gradle.workers.internal.DefaultWorkerExecutor.lambda$submitWork$0(DefaultWorkerExecutor.java:176)
|
||||||
|
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
|
||||||
|
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runExecution(DefaultConditionalExecutionQueue.java:194)
|
||||||
|
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.access$700(DefaultConditionalExecutionQueue.java:127)
|
||||||
|
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner$1.run(DefaultConditionalExecutionQueue.java:169)
|
||||||
|
at org.gradle.internal.Factories$1.create(Factories.java:30)
|
||||||
|
at org.gradle.internal.work.DefaultWorkerLeaseService.lambda$withLocksAcquired$0(DefaultWorkerLeaseService.java:275)
|
||||||
|
at org.gradle.internal.work.ResourceLockStatistics$1.measure(ResourceLockStatistics.java:43)
|
||||||
|
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocksAcquired(DefaultWorkerLeaseService.java:273)
|
||||||
|
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:265)
|
||||||
|
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:128)
|
||||||
|
at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:133)
|
||||||
|
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.runBatch(DefaultConditionalExecutionQueue.java:164)
|
||||||
|
at org.gradle.internal.work.DefaultConditionalExecutionQueue$ExecutionRunner.run(DefaultConditionalExecutionQueue.java:133)
|
||||||
|
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
|
||||||
|
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
|
||||||
|
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
|
||||||
|
at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)
|
||||||
|
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
|
||||||
|
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
|
||||||
|
at java.base/java.lang.Thread.run(Unknown Source)
|
||||||
|
|
||||||
|
|
||||||
@@ -55,4 +55,10 @@ dependencies {
|
|||||||
androidTestImplementation(libs.androidx.junit)
|
androidTestImplementation(libs.androidx.junit)
|
||||||
debugImplementation(libs.androidx.compose.ui.test.manifest)
|
debugImplementation(libs.androidx.compose.ui.test.manifest)
|
||||||
debugImplementation(libs.androidx.compose.ui.tooling)
|
debugImplementation(libs.androidx.compose.ui.tooling)
|
||||||
|
|
||||||
|
implementation("com.google.android.gms:play-services-location:21.0.1")
|
||||||
|
implementation("com.squareup.retrofit2:retrofit:2.9.0")
|
||||||
|
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
|
||||||
|
implementation("com.google.android.gms:play-services-maps:18.1.0")
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -2,6 +2,13 @@
|
|||||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:tools="http://schemas.android.com/tools">
|
xmlns:tools="http://schemas.android.com/tools">
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
|
||||||
|
<uses-permission android:name="android.permission.INTERNET"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION"/>
|
||||||
|
|
||||||
<application
|
<application
|
||||||
android:allowBackup="true"
|
android:allowBackup="true"
|
||||||
android:dataExtractionRules="@xml/data_extraction_rules"
|
android:dataExtractionRules="@xml/data_extraction_rules"
|
||||||
@@ -11,6 +18,10 @@
|
|||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:supportsRtl="true"
|
android:supportsRtl="true"
|
||||||
android:theme="@style/Theme.CamionBasura">
|
android:theme="@style/Theme.CamionBasura">
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="com.google.geo.API_KEY"
|
||||||
|
android:value="AIzaSyAg5e7AeqVs4kWEsHgdYr6mGjJiHvZc0hg"/>
|
||||||
<activity
|
<activity
|
||||||
android:name=".MainActivity"
|
android:name=".MainActivity"
|
||||||
android:exported="true"
|
android:exported="true"
|
||||||
@@ -22,6 +33,10 @@
|
|||||||
<category android:name="android.intent.category.LAUNCHER" />
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
</application>
|
<category android:name="android.intent.category.LAUNCHER" />
|
||||||
|
</application>
|
||||||
|
|
||||||
|
<service
|
||||||
|
android:name=".service.CamionMonitorService"
|
||||||
|
android:foregroundServiceType="location" />
|
||||||
</manifest>
|
</manifest>
|
||||||
@@ -1,29 +1,76 @@
|
|||||||
package com.tuapp.camionbasura
|
package com.tuapp.camionbasura
|
||||||
|
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
import android.os.Bundle
|
import android.os.Bundle
|
||||||
import androidx.activity.ComponentActivity
|
import androidx.activity.ComponentActivity
|
||||||
import androidx.activity.compose.setContent
|
import androidx.activity.compose.setContent
|
||||||
import androidx.activity.enableEdgeToEdge
|
import androidx.compose.foundation.layout.*
|
||||||
import androidx.compose.foundation.layout.fillMaxSize
|
import androidx.compose.foundation.lazy.LazyColumn
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.lazy.items
|
||||||
import androidx.compose.material3.Scaffold
|
import androidx.compose.material3.*
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.runtime.*
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.tooling.preview.Preview
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import com.tuapp.camionbasura.model.ColoniaHorario
|
||||||
|
import com.tuapp.camionbasura.network.CamionRepository
|
||||||
|
import com.tuapp.camionbasura.service.CamionMonitorService
|
||||||
import com.tuapp.camionbasura.ui.theme.CamionBasuraTheme
|
import com.tuapp.camionbasura.ui.theme.CamionBasuraTheme
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
class MainActivity : ComponentActivity() {
|
class MainActivity : ComponentActivity() {
|
||||||
|
|
||||||
|
private val repository = CamionRepository()
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
enableEdgeToEdge()
|
|
||||||
|
// Iniciar servicio de monitoreo
|
||||||
|
val intent = Intent(this, CamionMonitorService::class.java)
|
||||||
|
startService(intent)
|
||||||
|
|
||||||
setContent {
|
setContent {
|
||||||
CamionBasuraTheme {
|
var horarios by remember { mutableStateOf<List<ColoniaHorario>>(emptyList()) }
|
||||||
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
|
|
||||||
Greeting(
|
LaunchedEffect(Unit) {
|
||||||
name = "Android",
|
CoroutineScope(Dispatchers.IO).launch {
|
||||||
modifier = Modifier.padding(innerPadding)
|
horarios = repository.obtenerHorarios()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MaterialTheme {
|
||||||
|
Column(modifier = Modifier.padding(16.dp)) {
|
||||||
|
Text(
|
||||||
|
text = "🚛 Camión de Basura - Celaya",
|
||||||
|
style = MaterialTheme.typography.headlineSmall
|
||||||
)
|
)
|
||||||
|
Spacer(modifier = Modifier.height(16.dp))
|
||||||
|
Text(
|
||||||
|
text = "Horarios por colonia:",
|
||||||
|
style = MaterialTheme.typography.titleMedium
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.height(8.dp))
|
||||||
|
LazyColumn {
|
||||||
|
items(horarios) { horario ->
|
||||||
|
Card(
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.padding(vertical = 4.dp)
|
||||||
|
) {
|
||||||
|
Column(modifier = Modifier.padding(12.dp)) {
|
||||||
|
Text(
|
||||||
|
text = horario.colonia,
|
||||||
|
style = MaterialTheme.typography.titleSmall
|
||||||
|
)
|
||||||
|
Text(text = "Ruta: ${horario.routeId}")
|
||||||
|
Text(text = "Horario: ${horario.horarioEstimado}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -44,4 +91,5 @@ fun GreetingPreview() {
|
|||||||
CamionBasuraTheme {
|
CamionBasuraTheme {
|
||||||
Greeting("Android")
|
Greeting("Android")
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
package com.tuapp.camionbasura.model
|
||||||
|
|
||||||
|
data class PushPayload(
|
||||||
|
val title: String,
|
||||||
|
val body: String
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Notificacion(
|
||||||
|
val triggerEvent: String,
|
||||||
|
val condition: String,
|
||||||
|
val pushPayload: PushPayload
|
||||||
|
)
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package com.tuapp.camionbasura.model
|
||||||
|
|
||||||
|
data class ColoniaHorario(
|
||||||
|
val colonia:String,
|
||||||
|
val routeId:String,
|
||||||
|
val horarioEstimado:String
|
||||||
|
)
|
||||||
16
app/src/main/java/com/tuapp/camionbasura/model/Ruta.kt
Normal file
16
app/src/main/java/com/tuapp/camionbasura/model/Ruta.kt
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
package com.tuapp.camionbasura.model
|
||||||
|
|
||||||
|
data class Posicion(
|
||||||
|
val posicion: Int,
|
||||||
|
val lat: Double,
|
||||||
|
val lng: Double,
|
||||||
|
val speed: Int,
|
||||||
|
val timestamp: String
|
||||||
|
)
|
||||||
|
|
||||||
|
data class Ruta(
|
||||||
|
val routeId: String,
|
||||||
|
val name: String,
|
||||||
|
val status: String,
|
||||||
|
val positions: List<Posicion>
|
||||||
|
)
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
package com.tuapp.camionbasura.network
|
||||||
|
|
||||||
|
import com.tuapp.camionbasura.model.ColoniaHorario
|
||||||
|
import com.tuapp.camionbasura.model.Notificacion
|
||||||
|
import com.google.gson.Gson
|
||||||
|
import com.google.gson.reflect.TypeToken
|
||||||
|
import java.net.URL
|
||||||
|
import com.tuapp.camionbasura.model.Ruta
|
||||||
|
|
||||||
|
class CamionRepository {
|
||||||
|
|
||||||
|
private val urlNotificaciones = "https://td.celaya.biz:8018/sistemasJSON/notificaciones.json"
|
||||||
|
|
||||||
|
suspend fun obtenerNotificaciones(): List<Notificacion> {
|
||||||
|
return try {
|
||||||
|
val json = URL(urlNotificaciones).readText()
|
||||||
|
val tipo = object : TypeToken<List<Notificacion>>() {}.type
|
||||||
|
Gson().fromJson(json, tipo)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
emptyList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private val urlHorarios = "https://td.celaya.biz:8018/sistemasJSON/colonias-rutas.json"
|
||||||
|
|
||||||
|
suspend fun obtenerHorarios(): List<ColoniaHorario> {
|
||||||
|
return try {
|
||||||
|
val json = URL(urlHorarios).readText()
|
||||||
|
val tipo = object : TypeToken<List<ColoniaHorario>>() {}.type
|
||||||
|
Gson().fromJson(json, tipo)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
emptyList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
private val urlRutas = "https://td.celaya.biz:8018/sistemasJSON/rutas.json"
|
||||||
|
|
||||||
|
suspend fun obtenerRutas(): List<Ruta> {
|
||||||
|
return try {
|
||||||
|
val json = URL(urlRutas).readText()
|
||||||
|
val tipo = object : TypeToken<List<Ruta>>() {}.type
|
||||||
|
Gson().fromJson(json, tipo)
|
||||||
|
} catch (e: Exception) {
|
||||||
|
emptyList()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
package com.tuapp.camionbasura.service
|
||||||
|
|
||||||
|
import android.app.NotificationChannel
|
||||||
|
import android.app.NotificationManager
|
||||||
|
import android.app.Service
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.Intent
|
||||||
|
import android.os.IBinder
|
||||||
|
import androidx.core.app.NotificationCompat
|
||||||
|
import com.tuapp.camionbasura.network.CamionRepository
|
||||||
|
import kotlinx.coroutines.*
|
||||||
|
|
||||||
|
class CamionMonitorService : Service() {
|
||||||
|
|
||||||
|
private val scope = CoroutineScope(Dispatchers.IO + SupervisorJob())
|
||||||
|
private val repository = CamionRepository()
|
||||||
|
private val CHANNEL_ID = "camion_channel"
|
||||||
|
|
||||||
|
override fun onCreate() {
|
||||||
|
super.onCreate()
|
||||||
|
crearCanalNotificacion()
|
||||||
|
iniciarMonitoreo()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun iniciarMonitoreo() {
|
||||||
|
scope.launch {
|
||||||
|
while (isActive) {
|
||||||
|
verificarNotificaciones()
|
||||||
|
delay(30_000L)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private suspend fun verificarNotificaciones() {
|
||||||
|
val notificaciones = repository.obtenerNotificaciones()
|
||||||
|
notificaciones.forEach { notificacion ->
|
||||||
|
if (notificacion.triggerEvent == "TRUCK_PROXIMITY") {
|
||||||
|
enviarNotificacion(
|
||||||
|
notificacion.pushPayload.title,
|
||||||
|
notificacion.pushPayload.body
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun crearCanalNotificacion() {
|
||||||
|
val channel = NotificationChannel(
|
||||||
|
CHANNEL_ID,
|
||||||
|
"Camión de Basura",
|
||||||
|
NotificationManager.IMPORTANCE_HIGH
|
||||||
|
)
|
||||||
|
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||||
|
manager.createNotificationChannel(channel)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun enviarNotificacion(titulo: String, mensaje: String) {
|
||||||
|
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
|
||||||
|
val notificacion = NotificationCompat.Builder(this, CHANNEL_ID)
|
||||||
|
.setContentTitle(titulo)
|
||||||
|
.setContentText(mensaje)
|
||||||
|
.setSmallIcon(android.R.drawable.ic_dialog_info)
|
||||||
|
.setPriority(NotificationCompat.PRIORITY_HIGH)
|
||||||
|
.build()
|
||||||
|
manager.notify(1, notificacion)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBind(intent: Intent?): IBinder? = null
|
||||||
|
|
||||||
|
override fun onDestroy() {
|
||||||
|
super.onDestroy()
|
||||||
|
scope.cancel()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package com.tuapp.camionbasura.util
|
||||||
|
|
||||||
|
object DistanciaUtil {
|
||||||
|
const val DISTANCIA_ALERTA_METROS = 100f
|
||||||
|
}
|
||||||
4
gradle/wrapper/gradle-wrapper.properties
vendored
4
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,4 +1,8 @@
|
|||||||
|
<<<<<<< HEAD
|
||||||
#Fri May 22 14:58:18 CST 2026
|
#Fri May 22 14:58:18 CST 2026
|
||||||
|
=======
|
||||||
|
#Fri May 22 15:16:44 CST 2026
|
||||||
|
>>>>>>> a80ea289fd32cc25c1aadbfa295b6f00b7b775f6
|
||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionSha256Sum=2ab2958f2a1e51120c326cad6f385153bb11ee93b3c216c5fccebfdfbb7ec6cb
|
distributionSha256Sum=2ab2958f2a1e51120c326cad6f385153bb11ee93b3c216c5fccebfdfbb7ec6cb
|
||||||
|
|||||||
Reference in New Issue
Block a user