Fix marge conflicts

This commit is contained in:
Angel Osvaldo Frias Arriaga
2026-05-23 08:16:59 -06:00
14 changed files with 307 additions and 13 deletions

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
CamionBasura

View File

@@ -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
View File

@@ -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>

View 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)

View File

@@ -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")
} }

View File

@@ -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>
<category android:name="android.intent.category.LAUNCHER" />
</application> </application>
<service
android:name=".service.CamionMonitorService"
android:foregroundServiceType="location" />
</manifest> </manifest>

View File

@@ -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")
} }
} }

View File

@@ -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
)

View File

@@ -0,0 +1,7 @@
package com.tuapp.camionbasura.model
data class ColoniaHorario(
val colonia:String,
val routeId:String,
val horarioEstimado:String
)

View 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>
)

View File

@@ -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()
}
}
}

View File

@@ -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()
}
}

View File

@@ -0,0 +1,5 @@
package com.tuapp.camionbasura.util
object DistanciaUtil {
const val DISTANCIA_ALERTA_METROS = 100f
}

View File

@@ -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