B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Service
Version=11
@EndOfDesignText@
#Region  Service Attributes 
	#StartAtBoot: True
#End Region
'******************************************************************************
'No olvidar agregar esta linea al editor de manifiesto:
' SetServiceAttribute(Tracker, android:foregroundServiceType, "location")
'
'En Starter agregar estas lineas en Process_Globals
'	Public rp As RuntimePermissions
'	Public FLP As FusedLocationProvider
'	Private flpStarted As Boolean
'
'En Main agregar estas lineas a Activity_Resume
'	Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION)
'	Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
'	If Result Then
'		StartService(Tracker)
'		Log("Start Tracker")
'	Else
'		ToastMessageShow("No permission", True)
'	End If
'
'Se necesitan las librerias FusedLocationProvider, GPS, Phone y RunTimePermissions
'
'Y en Main agregar estas dos lineas:
'#AdditionalJar: com.android.support:support-v4
'#AdditionalJar: com.google.android.gms:play-services-location

Sub Process_Globals
'	Private nid As Int = 1
	Private Tracking As Boolean
	Private lock As PhoneWakeState
	'Para FusedLocationProvider (2 lineas)
	Public FLP As FusedLocationProvider
	Dim actualLR As LocationRequest
	Private flpStarted As Boolean
'	Dim locRequest As String
	Dim UUGCoords As Location 'Ultima Ubicacion Guardada
'	Dim trackerActividad, pushServiceActividad As String
	Dim logger As Boolean
End Sub

Sub Service_Create
	Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER 'we are handling it ourselves
	UUGCoords.Initialize
	logger = False
	'Para FusedLocationProvider (2 lineas)
	FLP.Initialize("flp")
	FLP.Connect
	lock.PartialLock
	StartFLP
End Sub

Sub flp_ConnectionSuccess
'	If logger Then Log("Connected to location provider")
	'FLP.GetLastKnownLocation
End Sub

Sub flp_ConnectionFailed(ConnectionResult1 As Int)
	If logger Then Log("Failed to connect to location provider")
End Sub

Sub flp_ConnectionSuspended(ConnectionResult1 As Int)
	If logger Then Log("FLP conection suspended")
	StartFLP
End Sub

Sub Service_Start (StartingIntent As Intent)
	LogColor("Iniciando Tracker ...", Colors.Green)
	Service.StopAutomaticForeground
'	Service.StartForeground(51042, Subs.notiLowReturn("Kelloggs", "Activo", 51042))
	StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True)
	Track
	If Not(Starter.Logger) Then logger = False
End Sub

Public Sub Track
	If logger Then Log("Inicia Track - Tracking : "&Tracking)
	If Tracking Then
'		Log(actualLR.GetSmallestDisplacement)
		Return 'Si ya estamos "rastreando" no hacemos nada (return)
	End If
	If Starter.rp.Check(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) = False Then
		If logger Then Log("Sin permisos de ublicación.")
		Return
	End If
	StartFLP 'Iniciamos FusedLocationProvider
	Tracking = True
End Sub

Public Sub StartFLP
	If logger Then Log("StartFLP - flpStarted="&flpStarted)
	Do While FLP.IsConnected = False
		Sleep(500)
		If logger Then Log("kll - sleeping")
	Loop
'	If flpStarted = False Then
'	If logger Then Log("RequestLocationUpdates")
	FLP.RequestLocationUpdates(CreateLocationRequest) 'Buscamos ubicacion
	If logger Then LogColor("Buscamos ubicacion (movimientoMinimo = "&actualLR.GetSmallestDisplacement&")", Colors.Magenta)
'	If logger Then Log(actualLR.GetSmallestDisplacement)
	flpStarted = True
'	End If
End Sub

Public Sub StartFLP2
	If logger Then Log("StartFLP2 - flpStarted="&flpStarted)
	Do While FLP.IsConnected = False
		Sleep(500)
		If logger Then Log("kll - sleeping")
	Loop
	dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida
	FLP.RequestLocationUpdates(CreateLocationRequest2) 'Buscamos ubicacion 2 peticiones
	If logger Then LogColor("Buscamos ubicacion (movimientoMinimo = "&actualLR.GetSmallestDisplacement&")", Colors.Magenta)
'	If logger Then Log(actualLR.GetSmallestDisplacement)
End Sub

Public Sub StartFLPSmall
'	Log("StartFLPSmall - flpStarted="&flpStarted)
	Do While FLP.IsConnected = False
		Sleep(500)
		If logger Then Log("kll - sleeping")
	Loop
	dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida
	FLP.RequestLocationUpdates(CreateLocationRequestSmallD) 'Buscamos ubicacion 2 peticiones
'	Log("Buscamos ubicacion Small displacement")
'	Log("GPSSmallestDisplacement = " & actualLR.GetSmallestDisplacement)
End Sub

Private Sub CreateLocationRequest As LocationRequest
'	If logger Then Log("CreateLocationRequest")
	Dim lr As LocationRequest
	lr.Initialize
	lr.SetInterval(10000) 'Intervalo deseado para actualizaciones de ubicacion
	lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion
	lr.SetSmallestDisplacement(75) 'Solo registra cambio de ubicacion si es mayor a XX mts
	lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY)
	actualLR=lr
	Return lr
End Sub

Private Sub CreateLocationRequest2 As LocationRequest
	If logger Then Log("Iniciamos CreateLocationRequest2")
	Dim lr As LocationRequest
	lr.Initialize
	lr.SetInterval(2000) 'Intervalo deseado para actualizaciones de ubicacion
	lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion
	lr.setNumUpdates(2) 'Solicitamos solo 2 actualizaciones con estos parametros
	lr.SetSmallestDisplacement(1) 'Solo registra cambio de ubicacion si es mayor a XX mts
	lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY)
	actualLR=lr
	Return lr
End Sub

Private Sub CreateLocationRequestSmallD As LocationRequest
'	Log("Iniciamos CreateLocationRequestSmallD")
	Dim lr As LocationRequest
	lr.Initialize
	lr.SetInterval(2000) 'Intervalo deseado para actualizaciones de ubicacion
	lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion
	lr.setNumUpdates(2) 'Solicitamos solo 2 actualizaciones con estos parametros
	lr.SetSmallestDisplacement(0) 'Solo registra cambio de ubicacion si es mayor a XX mts
	lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY)
	actualLR=lr
	Return lr
End Sub

Sub dameUltimaUbicacionConocida
	If FLP.GetLastKnownLocation.IsInitialized Then 'Mandamos ultima ubicacion guardada
'		If logger Then LogColor($"Mandamos UUC "${Subs.fechaKMT(FLP.GetLastKnownLocation.Time)}|Acc:$0.2{FLP.GetLastKnownLocation.Accuracy}|$0.8{FLP.GetLastKnownLocation.Latitude}|$0.8{FLP.GetLastKnownLocation.Longitude}|Spd:$0.2{FLP.GetLastKnownLocation.Speed}|"$, Colors.RGB(255,112,35))
'		Dim coords As String = FLP.GetLastKnownLocation.Latitude&","&FLP.GetLastKnownLocation.Longitude&","&formatoFecha(FLP.GetLastKnownLocation.Time)
'		CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords)
'		Subs.mandamosLoc(coords)
	End If
End Sub

Public Sub StopFLP
	'Log("StopFLP")
	If flpStarted Then
		FLP.RemoveLocationUpdates  'Eliminamos todas las solicitudes de ubicacion
		flpStarted = False
	End If
End Sub

Sub flp_LocationChanged (Location1 As Location)
	LogColor($"Location changed lat=${Location1.Latitude}, lon=${Location1.Longitude}, Acc=${Location1.Accuracy}, SD=$1.0{actualLR.GetSmallestDisplacement}"$, Colors.green)
	UUGCoords = Location1
'	If logger Then Log("SmallestDisplacement="&actualLR.GetSmallestDisplacement)
'	CallSub2(Starter, "GPS_LocationChanged", Location1)
'	CallSub2(gestion, "GPS_LocationChanged", Location1)
	Starter.lat_gps = Location1.Latitude
	Starter.lon_gps = Location1.Longitude
	Starter.ubicacionActual = Location1
	'Si las coordenadas estan en CERO o NULL entonces usamos "GetLastKnownLocation"
	If Starter.lat_gps = 0 Or Starter.lat_gps = Null And FLP.GetLastKnownLocation.IsInitialized Then
		Starter.lat_gps = FLP.GetLastKnownLocation.Latitude
		Starter.lon_gps = FLP.GetLastKnownLocation.Longitude
		Starter.ubicacionActual = FLP.GetLastKnownLocation
		LogColor("Coords en CERO - Guardamos ultima ubicacion conocida", Colors.red)
	End If
'	Starter.ubicacionActual.Latitude = Starter.lat_gps
'	Starter.ubicacionActual.Longitude = Starter.lon_gps
'	Starter.ubicacionActual.Accuracy = Location1.Accuracy

	'/////// para la ultima ubicacion FL
	Dim sDate,sTime As String
	DateTime.DateFormat = "MM/dd/yyyy"
	sDate=DateTime.Date(DateTime.Now)
	sTime=DateTime.Time(DateTime.Now)
	If Starter.lat_gps <> 0 And Starter.lat_gps <> Null Then
		Try
			Starter.skmt.ExecNonQuery("DELETE FROM HIST_GPS")
			Starter.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, Starter.lat_gps, Starter.lon_gps))
		Catch
			If logger Then Log("Error al borrar o insertar nuevas coordendas en HIST_GPS")
		End Try
	End If

	Dim origFormat As String = DateTime.TimeFormat 'Guardamos formato de fecha.
	DateTime.TimeFormat = "HHmmss" ' Modificamos formato de fecha.
	Dim minsDif As Int = DateTime.Time(DateTime.Now) - Starter.ultimaActualizacionGPS
'	If logger Then Log("UltimaAct="&Starter.ultimaActualizacionGPS&" MinsDif="&minsDif)
	If Location1.Accuracy < 100 And minsDif > 240 Then 'Si precision de 100 y 4 min transcurridos manda a web.
		If logger Then Log("Actualizamos Ubicacion Web")
		CallSubDelayed(Starter, "ENVIA_ULTIMA_GPS")
	End If
	DateTime.TimeFormat = origFormat 'Regresamos formato de fecha original.
	If B4XPages.MainPage.cliente.IsInitialized Then B4XPages.MainPage.cliente.GPS_LocationChanged(Location1)
	If B4XPages.MainPage.nuevoCliente.IsInitialized Then B4XPages.MainPage.nuevoCliente.GPS_LocationChanged(Location1)
	If Not(IsPaused(MAPA_RUTAS)) Then CallSubDelayed2(MAPA_RUTAS, "GPS_LocationChanged", Location1)
End Sub

Sub CreateNotification (Body As String) As Notification 'ignore
	Dim notification As Notification
	notification.Initialize2(notification.IMPORTANCE_LOW)
	notification.Icon = "icon"
	notification.SetInfo("This", Body, Main)
	Return notification
End Sub

Sub Service_Destroy
	If Tracking Then
		StopFLP
	End If
	Tracking = False
	lock.ReleasePartialLock
End Sub

Sub formatoFecha(fecha As String) As String 'ignore 'Convierte una fecha al formato yyMMddHHmmss
'	Log(fecha)
	Dim OrigFormat As String = DateTime.DateFormat  'save orig date format
	DateTime.DateFormat = "yyMMddHHmmss"
	Dim lastUpdate As String = DateTime.Date(fecha)
	DateTime.DateFormat = OrigFormat  'return to orig date format
'	Log(lastUpdate)
	Return lastUpdate
End Sub