B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Service
Version=10.2
@EndOfDesignText@
#Region  Service Attributes 
	#StartAtBoot: True
#End Region
'******************************************************************************
' 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
End Sub

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

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

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

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

Sub Service_Start (StartingIntent As Intent)
	If Main.logger Then Log("Tracker Service Started")
	'Para FusedLocationProvider (1 linea)
	Service.StopAutomaticForeground
	Service.StartForeground(nid, CreateNotification("..."))
	Track
	StartServiceAt(Me, DateTime.Now + 5 * DateTime.TicksPerMinute, True)
End Sub

Public Sub Track
	If Main.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 Main.logger Then Log("No permission")
		Return
	End If
	StartFLP 'Iniciamos FusedLocationProvider
	Tracking = True
End Sub

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

Public Sub StartFLP2Reqs
	If Main.logger Then Log("StartFLP - flpStarted="&flpStarted)
	Do While FLP.IsConnected = False
		Sleep(500)
		If Main.logger Then Log("sleeping")
	Loop
	dameUltimaUbicacionConocida 'Regresamos ultima ubicacion conocida
	FLP.RequestLocationUpdates(CreateLocationRequest2times) 'Buscamos ubicacion 2 peticiones
	If Main.logger Then Log("Buscamos ubicacion 2 peticiones")
	If Main.logger Then Log(actualLR.GetSmallestDisplacement)
End Sub

Private Sub CreateLocationRequest As LocationRequest
	If Main.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 CreateLocationRequest2times As LocationRequest
	If Main.logger Then Log("Iniciamos CreateLocationRequest2times")
	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(10) '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 Main.logger Then Log("Mandamos GetLastKnownLocation : "&formatoFecha(FLP.GetLastKnownLocation.Time))
		Dim coords As String = FLP.GetLastKnownLocation.Latitude&","&FLP.GetLastKnownLocation.Longitude&","&formatoFecha(FLP.GetLastKnownLocation.Time)
		CallSubDelayed2(FirebaseMessaging,"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)
	If Main.logger Then Log("SmallestDisplacement="&actualLR.GetSmallestDisplacement)
	CallSub2(Starter, "GPS_LocationChanged", Location1)
	CallSub2(gestion, "GPS_LocationChanged", Location1)
	Main.lat_gps = Location1.Latitude
	Main.lon_gps = Location1.Longitude
	'/////// 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)
	Try
		Main.skmt.ExecNonQuery("DELETE FROM HIST_GPS")
		Main.skmt.ExecNonQuery2("INSERT INTO HIST_GPS (HGDATE, HGLAT, HGLON) VALUES(?,?,?) ", Array As Object (sDate & sTime, Main.lat_gps, Main.lon_gps))
	Catch
		If Main.logger Then Log("Error al borrar o insertar nuevas coordendas en HIST_GPS")
	End Try
	'///////
	Dim coords As String = Location1.Latitude&","&Location1.Longitude&","&formatoFecha(Location1.Time)
	If Main.logger Then Log("Loc changed : "&Location1.Latitude&","&Location1.Longitude&"|"&Main.usuario&"|")
	If Main.logger Then Log("Mandamos Ubicacion")
	If Main.logger Then Log(FirebaseMessaging.locRequest)
	' Solo mandamos la ubicacion si la precision es dentro de XX mts
	If Location1.Accuracy < 300 Then CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords)
	If Location1.Accuracy < 100 Then 'Si precision de 100 y 4 min transcurridos manda a web
		If Main.logger Then Log("actualizamos Ubicacion")
		CallSubDelayed(Starter, "ENVIA_ULTIMA_GPS")
	End If
'	CallSubDelayed2(FirebaseMessaging,"mandamosLoc",coords)
End Sub

Sub CreateNotification (Body As String) As Notification
	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 '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
