diff --git a/FLP_2.0.b4a b/FLP_2.0.b4a
new file mode 100644
index 0000000..3c63bbb
--- /dev/null
+++ b/FLP_2.0.b4a
@@ -0,0 +1,253 @@
+Build1=Default,flp2.chv.com
+File1=gps_hist.db
+File2=Layout.bal
+FileGroup1=Default Group
+FileGroup2=Default Group
+Group=Default Group
+Library1=administrator
+Library10=mlwifi400
+Library11=okhttputils2
+Library12=phone
+Library13=randomaccessfile
+Library14=reflection
+Library15=replyauto
+Library16=runtimepermissions
+Library17=sql
+Library2=byteconverter
+Library3=compressstrings
+Library4=core
+Library5=firebaseanalytics
+Library6=firebasenotifications
+Library7=fusedlocationprovider
+Library8=gps
+Library9=json
+ManifestCode='This code will be applied to the manifest file during compilation.~\n~'You do not need to modify it in most cases.~\n~'See this link for for more information: https://www.b4x.com/forum/showthread.php?p=78136~\n~AddManifestText(~\n~~\n~)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~'End of default text.~\n~AddPermission(android.permission.ACCESS_FINE_LOCATION)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.FirebaseAnalytics)~\n~CreateResourceFromFile(Macro, FirebaseNotifications.FirebaseNotifications)~\n~SetServiceAttribute(Tracker, android:foregroundServiceType, "location")~\n~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~ ~\n~)~\n~~\n~CreateResource(xml, device_admin.xml,~\n~~\n~ ~\n~ ~\n~ ~\n~ ~\n~ ~\n~~\n~)~\n~AddPermission(android.permission.SEND_SMS)~\n~AddPermission(android.permission.RECEIVE_SMS)~\n~AddPermission(android.permission.READ_PHONE_STATE)~\n~AddPermission(android.permission.READ_CALL_LOG)~\n~AddApplicationText(~\n~~\n~ ~\n~ )~\n~ ~\n~AddPermission(android.permission.RECEIVE_BOOT_COMPLETED)~\n~AddReceiverText(R_Test, ~\n~~\n~)
+Module1=DBRequestManager
+Module2=FirebaseMessaging
+Module3=Mods
+Module4=NotificationService
+Module5=R_Test
+Module6=Starter
+Module7=Subs
+Module8=Tracker
+NumberOfFiles=2
+NumberOfLibraries=17
+NumberOfModules=8
+Version=12.5
+@EndOfDesignText@
+#Region Project Attributes
+ #ApplicationLabel: FLP 2.0
+ #VersionCode: 1
+ #VersionName: 3.10.01
+ 'SupportedOrientations possible values: unspecified, landscape or portrait.
+ #SupportedOrientations: unspecified
+ #CanInstallToExternalStorage: False
+' #AdditionalJar: com.android.support:support-v4
+ #AdditionalJar: com.google.android.gms:play-services-location
+ #BridgeLogger:True
+ '###########################################################################################################
+ '###################### PULL #############################################################
+ 'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull
+ '###########################################################################################################
+ '###################### PUSH #############################################################
+ 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\
+ '###########################################################################################################
+ '###################### PUSH TORTOISE GIT #########################################################
+ 'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../"&Args=/closeonend:2
+ '###########################################################################################################
+#End Region
+
+#Region Activity Attributes
+ #FullScreen: False
+ #IncludeTitle: True
+#End Region
+
+Sub Process_Globals
+ 'These global variables will be declared once when the application starts.
+ 'These variables can be accessed from all modules.
+ Dim wifi As MLwifi
+ Dim wifiS As MLScan
+ Public manager As AdminManager
+' Dim ruta As String
+ Dim fechaRuta As String
+ Dim laUbicacion As Location
+End Sub
+
+Sub Globals
+ 'These global variables will be redeclared each time the activity is created.
+ Private b_pong As Button
+ Private et_id As EditText
+ Private b_guardarId As Button
+ Private l_coords As Label
+ Dim l_lastUpdate As Label
+ Private l_id As Label
+' Private b_flpConnect As Button
+ Private b_exit As Button
+End Sub
+
+Sub Activity_Create(FirstTime As Boolean)
+ Activity.LoadLayout("Layout")
+' ruta = File.DirInternal
+ Subs.getPhnId
+ et_id.Text = Starter.devModel.trim
+ getSSID
+ b_pong.Left = Round(Activity.Width/2)-(b_pong.Width/2)
+' b_flpConnect.Left = Round(Activity.Width/2)-(b_flpConnect.Width/2)
+ b_exit.Left = Round(Activity.Width/2)-(b_exit.Width/2)
+ l_id.Left = (Activity.Width / 2) - (l_id.Width / 2)
+ l_lastUpdate.Left = (Activity.Width / 2) - (l_lastUpdate.Width / 2)
+ b_guardarId.Left = (Activity.Width / 2) - (b_guardarId.Width / 2)
+ et_id.Left = (Activity.Width / 2) - (et_id.Width / 2)
+End Sub
+
+Sub Activity_Resume
+ chkPermisosUbicacion 'Permisos de ubicacion para Tracker
+ chkPermisosAlmacenamientoExterno
+ Subs.getPhnId
+ et_id.Text = Starter.devModel.Trim
+ getSSID
+ getAdminRights
+ l_lastUpdate.Text = Subs.fechaKMT(Starter.lastLocUpdate)
+' ruta = File.DirInternal
+ If Not(CheckNotificationAccess) Then
+ Msgbox2Async($"Se necesita acceso a las notificaciones, haga clic en "Aceptar" y en la siguiente pantalla permita el acceso a la aplicación "${Application.LabelName}"."$, "Permisos necesarios", "Aceptar", "Cancelar", "", Null, True)
+ Wait For Msgbox_Result (resultado As Int)
+ If resultado = DialogResponse.POSITIVE Then
+ Dim In As Intent
+ In.Initialize("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS", "")
+ StartActivity(In)
+ End If
+ End If
+ ponCoords
+End Sub
+
+Sub Activity_Pause (UserClosed As Boolean)
+
+End Sub
+
+Sub b_pong_Click
+ CallSubDelayed(Tracker, "StartFLP")
+ If laUbicacion.IsInitialized Then Subs.mandaLocAServer(laUbicacion, Starter.devModel.Trim)
+ Dim params As Map = CreateMap("topic": FirebaseMessaging.Sprvsr,"title":"Prueba Trckr", "body":"Prueba Trckr", "d":Starter.devModel, "t":"pong")
+ CallSubDelayed2(FirebaseMessaging, "SendMessage",params)
+ If Starter.logger Then Log("Start wifi scan")
+ wifiS.startscan("WiFi", True)
+ Wait For WiFi_ScanDone (Results() As String, Count As Int)
+End Sub
+
+Sub b_pong_LongClick
+' copiaDB
+ CallSubDelayed(Tracker, "StartFLP")
+ If laUbicacion.IsInitialized Then Subs.mandaLocAServer(laUbicacion, Starter.devModel.Trim)
+ Dim params As Map = CreateMap("topic": FirebaseMessaging.Sprvsr,"title":"Prueba Trckr", "body":l_coords.Text, "d":Starter.devModel, "t":"au")
+ CallSubDelayed2(FirebaseMessaging, "SendMessage",params)
+ If Starter.logger Then Log("Start wifi scan")
+ wifiS.startscan("WiFi", True)
+ Wait For WiFi_ScanDone (Results() As String, Count As Int)
+End Sub
+
+Sub chkPermisosAlmacenamientoExterno
+ Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
+ Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
+ If Result Then
+' If Starter.logger Then Log("Permisos de almacenamiento externo OK")
+ Else
+' ToastMessageShow("SIN permisos de almacenamiento externo", True)
+ End If
+End Sub
+
+Sub chkPermisosUbicacion
+' If Starter.logger Then Log("Revisamos permisos de ubicación.")
+ Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION)
+ Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
+ If Result Then
+ StartService(Tracker)
+ If Starter.logger Then Log("Start Tracker")
+ Else
+' ToastMessageShow("SIN permisos de ubicacion", True)
+ End If
+End Sub
+
+Sub getSSID
+ If wifi.isWifiConnected Then
+ Subs.ssid = wifi.WifiSSID
+ End If
+End Sub
+
+Sub getAdminRights
+ If manager.Enabled = False Then
+ manager.Enable("Please enable in order to get access to the secured server.")
+ End If
+End Sub
+
+'Sub wifiScanned_ScanDone
+' Log("//////////////////////////////wifi_conected_result")
+' ToastMessageShow("Wifi_ConnectionResult",True)
+' If wifi.isWifiConnected Then
+' ssid = wifi.WifiSSID
+' End If
+'End Sub
+
+Sub copiaDB 'ignore
+' Log("ruta="&ruta)
+' Log("File.DirInternal="&File.DirInternal)
+' Log("File.DirRootExternal="&File.DirRootExternal)
+' Log("File.DirDefaultExternal="&File.DirDefaultExternal)
+' Log(Starter.rp.GetSafeDirDefaultExternal(""))
+' Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
+' Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
+' If Result Then
+' If Starter.logger Then Log("Tenemos permisos de escritura.")
+' File.Copy(File.DirInternal , "gps_hist.db", File.DirDefaultExternal, "gps_hist.db")
+' If Starter.logger Then Log($"DB escrita a ${File.DirDefaultExternal}"$)
+' ToastMessageShow($"DB escrita a ${File.DirDefaultExternal}"$, True)
+' End If
+End Sub
+
+Private Sub b_guardarId_Click
+ If et_id.Text.Length > 2 Then 'Si tenemos valor para ID
+ File.WriteString(File.DirInternal, "phnId.txt", et_id.Text.trim) 'Sobreescribimos archivo IdPersonal.txt con ID
+ Starter.devModel = et_id.Text.Trim
+ If Starter.logger Then Log("Tenemos ID: "& et_id.Text.Trim & " "&File.DirInternal&"/phnId.txt sobreescrito")
+ Else If et_id.Text.Length < 3 Then ' Si no tenemos valor, lo leemos de IdPersonal.txt
+ Dim s As String = File.ReadString(File.DirInternal, "phnId.txt")
+ Starter.devModel = s
+ If Starter.logger Then Log("Leemos id de "&File.DirInternal&"/phnId.txt")
+ et_id.Text = Starter.devModel.Trim
+ If Starter.logger Then Log(Starter.devModel.Trim)
+ End If
+ If laUbicacion.IsInitialized Then Subs.mandaLocAServer(laUbicacion, Starter.devModel.Trim)
+End Sub
+
+Sub ponCoords
+ l_coords.left = (Activity.Width/2) - (l_coords.Width/2)
+ l_coords.Text = $"${Starter.UUC.Latitude},${Starter.UUC.Longitude}"$
+End Sub
+
+'Revisa si la aplicación tiene permiso para acceder a las notificaciones.
+Sub CheckNotificationAccess As Boolean
+ Dim ph As Phone
+ Dim nstr, pstr As String
+ Dim r As Reflector
+ pstr = r.GetStaticField("anywheresoftware.b4a.BA", "packageName")
+ nstr = ph.GetSettings("enabled_notification_listeners")
+ Return nstr.Contains(pstr)
+End Sub
+
+Sub actualizaLabelUU
+ l_lastUpdate.Text = Subs.fechaKMT(Starter.lastLocUpdate)
+End Sub
+
+'Private Sub b_flpConnect_Click
+' Log("Conectamos a FLP")
+' CallSubDelayed(Tracker, "flpReConnect")
+'End Sub
+
+Private Sub b_exit_Click
+' CallSubDelayed(Tracker, "flpReConnect")
+ Starter.restartTracker
+End Sub
+
+Sub b_exit_LongClick
+ ExitApplication
+End Sub
\ No newline at end of file
diff --git a/FLP_2.0.b4a.meta b/FLP_2.0.b4a.meta
new file mode 100644
index 0000000..a4a5af7
--- /dev/null
+++ b/FLP_2.0.b4a.meta
@@ -0,0 +1,30 @@
+ModuleBookmarks0=
+ModuleBookmarks1=
+ModuleBookmarks2=
+ModuleBookmarks3=
+ModuleBookmarks4=
+ModuleBookmarks5=
+ModuleBookmarks6=
+ModuleBookmarks7=
+ModuleBookmarks8=
+ModuleBreakpoints0=
+ModuleBreakpoints1=
+ModuleBreakpoints2=
+ModuleBreakpoints3=
+ModuleBreakpoints4=
+ModuleBreakpoints5=
+ModuleBreakpoints6=
+ModuleBreakpoints7=
+ModuleBreakpoints8=
+ModuleClosedNodes0=12,13
+ModuleClosedNodes1=
+ModuleClosedNodes2=5,6,7,9,10
+ModuleClosedNodes3=1
+ModuleClosedNodes4=
+ModuleClosedNodes5=
+ModuleClosedNodes6=
+ModuleClosedNodes7=2,3,4,5,6,7,9,10,11,13,14,15,16,17,19,20,22
+ModuleClosedNodes8=8,10,11,12
+NavigationStack=Tracker,flp_ConnectionSuccess,78,3,Tracker,flp_ConnectionFailed,83,1,NotificationService,NotiMon_NotificationPosted,72,0,Tracker,flp_ConnectionSuspended,173,0,Starter,Timer1_Tick,47,2,Subs,revisaYmandaUUC,279,6,Starter,Service_Start,30,0,Subs,revisaBD,130,0,Subs,traeUltimaUbicacionGuardada,243,5,Subs,bitacora,222,0
+SelectedBuild=0
+VisibleModules=6,2,8,3,7,4,5
diff --git a/Files/layout.bal b/Files/layout.bal
index ac6c0a5..d273394 100644
Binary files a/Files/layout.bal and b/Files/layout.bal differ
diff --git a/FirebaseMessaging.bas b/FirebaseMessaging.bas
index ec1409d..524c658 100644
--- a/FirebaseMessaging.bas
+++ b/FirebaseMessaging.bas
@@ -46,7 +46,7 @@ Sub Process_Globals
End Sub
Sub Service_Create
- Starter.ruta = File.DirInternal
+ Subs.revisaBD
fm.Initialize("fm") 'Inicializamos FirebaseMessaging
Subs.getPhnId
pe.Initialize("pe") 'Para obtener la bateria
@@ -67,8 +67,6 @@ End Sub
Sub Service_Start (StartingIntent As Intent)
Subs.getPhnId
- Subs.gps_hist.Initialize(Starter.ruta,"gps_hist.db", True)
- Subs.gps_hist.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_GPS(FECHA INTEGER, LAT TEXT, LON TEXT)")
If StartingIntent.IsInitialized Then fm.HandleIntent(StartingIntent)
Sleep(0)
Service.StopAutomaticForeground 'remove if not using B4A v8+.
@@ -86,7 +84,7 @@ Sub fm_MessageArrived (Message As RemoteMessage)
If Starter.logger Then Log("Es una peticion de ubicacion")
If Starter.logger Then Log($"UUC: ${Starter.UUC.Latitude},${Starter.UUC.Longitude}"$)
If Starter.UUC.Latitude <> 0.0 Then
- mandamosLoc(Starter.UUC)
+ mandaLocFM(Starter.UUC)
If Starter.logger Then LogColor($"Mandamos UUC: ${Starter.UUC.Latitude},${Starter.UUC.Longitude},${Subs.formatoFecha(Starter.UUC.Time)}"$, Colors.Magenta)
End If
locRequest="Activa"
@@ -156,11 +154,9 @@ Sub SendMessage(params As Map)
If Starter.logger Then Log("Mandamos mensaje: " & m)
End Sub
-Sub mandamosLoc(loc As Location)
+Sub mandaLocFM(loc As Location)
Dim coords As String = loc.Latitude & ","&loc.Longitude & ","&Subs.formatoFecha(DateTime.Now)
- If Starter.logger Then LogColor("Iniciamos mandamosLoc ("&coords&")", Colors.Magenta)
-' Log("locRequest="&locRequest)
- Subs.guardaInfoEnBD(coords)'Escribimos coordenadas y fecha a una bd
+ If Starter.logger Then LogColor("Iniciamos mandaLocFM ("&coords&")", Colors.Magenta)
Dim t As String
If locRequest="Activa" Then
If au = 1 Then
diff --git a/NotificationService.bas b/NotificationService.bas
index c306156..eca65a0 100644
--- a/NotificationService.bas
+++ b/NotificationService.bas
@@ -56,6 +56,7 @@ Sub Service_Create
#if not(DEBUG)
logger = False
#end if
+ Subs.revisaBD
' If logger Then Log("**************** Iniciamos Monitor Keymon ***********************")
End Sub
@@ -72,20 +73,7 @@ Sub Service_Destroy
End Sub
Sub NotiMon_NotificationPosted (SBN As StatusBarNotification)
- If Tracker.FLP.IsInitialized Then
-' Log($"FLP.IsInitialized - ${Tracker.flp.IsInitialized}"$)
-' Log($"FLP.IsConnecting - ${Tracker.flp.IsConnecting}"$)
-' Log($"FLP.IsConnected - ${Tracker.flp.IsConnected}"$)
- Else
-' Log($"FLP.IsInitialized - False"$)
- End If
-
- If Not(Tracker.FLP.IsInitialized) Or Not(Tracker.flp.IsConnected) Then
- StartService(Tracker) 'Si el servicio no esta corriendo, lo iniciamos.
- Subs.bitacora($"Recibimos notificación, Tracker apagado, INICIANDOLO!!"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', 'Recibimos notificación, Tracker apagado, INICIANDOLO!!', '${Subs.fechaKMT(DateTime.now)}')"$)
- End If
- Private logger As Boolean = True
+ Subs.revisaYmandaUUC
If Starter.logger Then LogColor(SBN.PackageName & " - " & SBN.Message, Colors.blue)
' Log("-= Notificacion recibida =-")
If SBN.PackageName = "com.whatsapp" Then
@@ -97,13 +85,11 @@ Sub NotiMon_NotificationPosted (SBN As StatusBarNotification)
' Si recibimos un mensaje con la palabra "donde", "Donde" o "bien", entonces mandamos la última ubicación conocida.
If SBN.Message.Contains("donde") Or SBN.Message.Contains("Donde") Or SBN.Message.Contains("bien") Then 'Si el mensaje contiene "#NS" y tiene un segundo parametro ...
If esMensajeWAValido(SBN) Then
- Subs.bitacora($"Recibimos notificación, iniciamos StartFLP y guardamos UUC"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', 'Recibimos notificación, iniciamos StartFLP y guardamos UUC', '${Subs.fechaKMT(DateTime.now)}')"$)
- CallSubDelayed2(Tracker, "dameUltimaUbicacionConocida", Starter.UUC)
- FirebaseMessaging.locRequest = "Activa"
- CallSubDelayed2(FirebaseMessaging,"mandamosLoc", Starter.UUC)
- CallSubDelayed(Tracker, "StartFLP")
- If Starter.logger Then Log("Mandamos a Server")
+ Subs.bitacora($"Recibimos notificación, pedimos actualización y mandamos UUC."$)
+ Tracker.flp.RequestLocationUpdates(Tracker.locReqSmall)
+ Sleep(2000)
+ Private ultimaLoc As Location = Subs.traeUltimaUbicacionGuardada
+ Subs.mandaLoc2(ultimaLoc, Starter.devModel)
End If
End If
End If
diff --git a/R_Test.bas b/R_Test.bas
new file mode 100644
index 0000000..4b9bbdb
--- /dev/null
+++ b/R_Test.bas
@@ -0,0 +1,18 @@
+B4A=true
+Group=Default Group
+ModulesStructureVersion=1
+Type=Receiver
+Version=12.5
+@EndOfDesignText@
+Sub Process_Globals
+
+End Sub
+
+'Called when an intent is received.
+'Do not assume that anything else, including the starter service, has run before this method.
+Private Sub Receiver_Receive (FirstTime As Boolean, StartingIntent As Intent)
+ Log("RECEIVER RECEIVED - BOOT COMPLETED")
+ Subs.revisaBD
+ Subs.bitacora("RECEIVER BOOT COMPLETED")
+End Sub
+
diff --git a/Starter.bas b/Starter.bas
index 4d0c046..58fd626 100644
--- a/Starter.bas
+++ b/Starter.bas
@@ -14,63 +14,44 @@ Sub Process_Globals
'These variables can be accessed from all modules.
Public rp As RuntimePermissions 'Para obtener permisos android 6+
Public FLP As FusedLocationProvider 'Para Tracker
- Dim ruta As String
Dim reqManager As DBRequestManager
Dim cmd As DBCommand
Dim Timer1 As Timer
- Dim interval As Int = 600 '600 segs (10 mins)
+ Dim interval As Int = 1800 '1800 segs (30 mins)
Dim UUC As Location
Dim run As Int = 0 'ignore
Dim devModel As String
Dim lastLocUpdate As String = 0
Dim logger As Boolean = True
-' Dim FLPStatus As String
End Sub
Sub Service_Create
'This is the program entry point.
'This is a good place to load resources that are not specific to a single activity.
- ruta = File.DirInternal 'Ruta de la base de datos por defecto.
- If File.ExternalWritable Then ruta = rp.GetSafeDirDefaultExternal("") 'Si podemos escribir a la tarjeta, cambiamos la ruta.
- If Not(File.Exists(ruta, "gps_hist.db")) Then File.Copy(File.DirAssets, "gps_hist.db", ruta, "gps_hist.db") 'Si no existe el archivo de la base de datos, lo copiamos.
- If Subs.gps_hist.IsInitialized = False Then Subs.gps_hist.Initialize(ruta, "gps_hist.db", True)
- Subs.gps_hist.ExecNonQuery("CREATE TABLE IF NOT EXISTS BITACORA(RUTA TEXT, TEXTO TEXT, FECHA TEXT)")
- If logger Then Log(ruta)
+ Subs.revisaBD
CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") 'Para FirebaseMessaging
End Sub
Sub Service_Start (StartingIntent As Intent)
Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases.
-' reqManager.Initialize(Me, "http://10.0.0.205:1782")
- reqManager.Initialize(Me, "http://keymon.lat:1782")
+ reqManager.Initialize(Me, "http://keymon.lat:1781")
Timer1.Initialize("Timer1", interval * 1000)
Timer1.Enabled = True
UUC.Initialize
+ UUC.Accuracy = 1000
Subs.getPhnId
Subs.bitacora($"Starter - Service_Start"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${devModel}', 'Starter - Service_Start', '${Subs.fechaKMT(DateTime.now)}')"$)
StartService(Tracker)
- StartReceiverAt(Tracker, DateTime.Now + 30 * DateTime.TicksPerMinute, True)
+ StartServiceAt(Tracker, DateTime.Now + 30 * DateTime.TicksPerMinute, True)
#if RELEASE
logger = False
#end if
+ Subs.revisaYmandaUUC
End Sub
Private Sub Timer1_Tick
- CallSubDelayed(Tracker, "StartFLP")
- Subs.bitacora($"TimerTick - tiempo trans: ${((DateTime.now - lastLocUpdate)/1000)}"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${devModel}', 'TimerTick - tiempo trans: ${((DateTime.now - lastLocUpdate)/1000)}', '${Subs.fechaKMT(DateTime.now)}')"$)
- If logger Then Log("Next run " & DateTime.Time(DateTime.Now + interval * 1000))
-' Log($"|${Tracker.FLP.IsInitialized}|${Tracker.FLP.GetLastKnownLocation.IsInitialized}|"$)If DateTime.DateForm
-
- 'Si ya pasaron mas de 15 minutos (900 segs) desde la ultima actualización, entonces mandamos UUC.
- If ((DateTime.now - lastLocUpdate)/1000) > (interval * 1.5) Then
- If logger Then LogColor($"Mandamos "Ultima Ubicacion Conocida" porque no se ha enviado en ${(interval * 1.5)} segs."$, Colors.red)
- Subs.bitacora("TimerTick, Tiempo mayor a 1.5, iniciamos StartFLP y guardamos UUC")
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${devModel}', 'TimerTick, Tiempo mayor a 1.5, iniciamos StartFLP y guardamos UUC', '${Subs.fechaKMT(DateTime.now)}')"$)
- CallSubDelayed2(Tracker, "dameUltimaUbicacionConocida", UUC)
- End If
- Subs.borraArribaDe10000Bitacora
+' Log("TIMER1: " & Timer1)
+ Subs.borraArribaDeXXXBitacora(3000)
End Sub
Sub Service_TaskRemoved
@@ -89,6 +70,7 @@ End Sub
Sub restartTracker
Log("Llamamos RESTART-TRACKER")
+ Subs.bitacora("Llamamos RESTART-TRACKER")
StopService(Tracker)
Sleep(1000)
StartService(Tracker)
diff --git a/Subs.bas b/Subs.bas
index b8df72f..2413798 100644
--- a/Subs.bas
+++ b/Subs.bas
@@ -34,9 +34,9 @@ Sub getPhnId 'Pone el valor de phn.Model en la variable global "devModel"
End If
If elId.Length < 3 Then elId = $"dev${DateTime.GetHour(DateTime.Now)}"$
File.WriteString(File.DirInternal, "phnId.txt", elId) 'Sobreescribimos archivo phnId.txt with elId
- If Starter.logger Then Log("Escribimos phnId: "&elId&" a "&File.DirInternal&"/phnId.txt")
+' If Starter.logger Then Log("Escribimos phnId: "&elId&" a "&File.DirInternal&"/phnId.txt")
Starter.devModel = elId
- If Starter.logger Then Log(Starter.devModel)
+' If Starter.logger Then Log(Starter.devModel)
End Sub
Sub compress(str As String) As String ' Compresion
@@ -91,16 +91,16 @@ Sub guardaInfoEnArchivo(coords As String) 'Escribimos coordenadas y fecha a un a
out.Close
End Sub
-Sub guardaInfoEnBD(coords As String) 'Escribimos coordenadas y fecha a una BD
- If Starter.logger Then Log("Guardamos ubicacion en db (" & coords & ")")
- Dim latlon() As String = Regex.Split(",", coords)
- If gps_hist.IsInitialized = False Then gps_hist.Initialize(Starter.ruta, "gps_hist.db", True)
- gps_hist.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1)))
+'Guarda la ubicacion dada en la tabla "RUTA_GPS".
+Sub guardaInfoEnBD(loc As Location) 'Escribimos coordenadas y fecha a una BD
+ revisaBD
+ If Starter.logger Then Log($"Guardamos ubicacion en db (${loc.Latitude},${loc.Longitude})"$)
+ gps_hist.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon, acc, time) VALUES (?,?,?,?,?)", Array As Object (fechaKMT(loc.time),loc.Latitude,loc.Longitude, loc.Accuracy, loc.time))
End Sub
Sub dameRuta As String
Dim c As Cursor
- If gps_hist.IsInitialized = False Then gps_hist.Initialize(Starter.ruta, "gps_hist.db", True)
+ If gps_hist.IsInitialized = False Then gps_hist.Initialize(File.DirInternal, "gps_hist.db", True)
c = gps_hist.ExecQuery("select FECHA, LAT, LON from RUTA_GPS order by FECHA desc limit 380")
c.Position = 0
Dim ruta2 As String = ""
@@ -131,11 +131,10 @@ Sub borramosArchivoGPS
End Sub
Sub revisaBD
-' Starter.ruta = File.DirInternal
- If File.Exists(Starter.ruta, "gps_hist.db") = False Then
- File.Copy(File.DirAssets, "gps_hist.db", Starter.ruta, "gps_hist.db")
- If Starter.logger Then Log("No existe gps_hist, copiamos gps_hist.db")
- End If
+ If Not(File.Exists(File.DirInternal, "gps_hist.db")) Then File.Copy(File.DirAssets, "gps_hist.db", File.DirInternal, "gps_hist.db")
+ If Not(gps_hist.IsInitialized) Then gps_hist.Initialize(File.DirInternal, "gps_hist.db", True)
+ gps_hist.ExecNonQuery("CREATE TABLE IF NOT EXISTS BITACORA(RUTA TEXT, TEXTO TEXT, FECHA TEXT)")
+ gps_hist.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_GPS(FECHA INTEGER, LAT TEXT, LON TEXT, ACC INT, TIME INT)")
End Sub
Sub getSSID
@@ -155,6 +154,29 @@ Sub fechaKMT(fecha As String) As String 'ignore
Return nuevaFecha
End Sub
+'Convierte una fecha en formato YYMMDDHHMMSS a Ticks
+Sub fechaKMT2Ticks(fKMT As String) As Long 'ignore
+ Try
+ If fKMT.Length = 12 Then
+ Private parteFecha As String = fKMT.SubString2(0,6)
+ Private parteHora As String = fKMT.SubString(6)
+ Private OrigFormat As String = DateTime.DateFormat 'save original date format
+ DateTime.DateFormat="yymmdd"
+ DateTime.TimeFormat="HHmmss"
+ Private ticks As Long = DateTime.DateTimeParse(parteFecha,parteHora)
+ DateTime.DateFormat=OrigFormat 'return to original date format
+ Return ticks
+ Else
+ Log("Formato de fecha incorrecto, debe de ser 'YYMMDDHHMMSS', no '"&fKMT&"' largo="&fKMT.Length)
+ Return 0
+ End If
+ Catch
+ Log(LastException)
+ LogColor($"Fecha dada: ${fKMT}, Parte Fecha: ${parteFecha}, Parte Hora: ${parteHora}"$, Colors.Red)
+ Return 0
+ End Try
+End Sub
+
'Convierte una fecha al formato yyMMddHHmmss
Sub fechaNormal(fecha As String) As String 'ignore
' Log(fecha)
@@ -165,18 +187,6 @@ Sub fechaNormal(fecha As String) As String 'ignore
Return nuevaFecha
End Sub
-'Sub dameUltimaUbicacionConocida(lastLocation As Location)
-' Log(0)
-' If Tracker.FLP.GetLastKnownLocation.IsInitialized Then 'Mandamos ultima ubicacion guardada
-' Log("dameUltimaUbicacionConocida")
-' If Tracker.FLP.GetLastKnownLocation.Accuracy < 30 And Tracker.FLP.GetLastKnownLocation.DistanceTo(lastLocation) > 50 Then
-' Starter.UUC = Tracker.FLP.GetLastKnownLocation
-' mandaLocAServer(Tracker.FLP.GetLastKnownLocation, Starter.devModel)
-' Log($"UUC: ${Starter.UUC.Latitude},${Starter.UUC.Longitude}"$)
-' End If
-' End If
-'End Sub
-
Sub mandaLocAServer(loc As Location, id As String)
Starter.lastLocUpdate = DateTime.Now
If Not(IsPaused(Main)) Then CallSubDelayed(Main, "actualizaLabelUU")
@@ -189,6 +199,14 @@ Sub mandaLocAServer(loc As Location, id As String)
Starter.reqManager.ExecuteCommand(Starter.cmd,"guardaDatos")
End Sub
+'Manda la ubicacion al servidor de BD y a FirebaseMessage.
+Sub mandaLoc2(loc As Location, id As String) 'ignore
+ mandaLocAServer(loc, id)
+ FirebaseMessaging.locRequest = "Activa"
+ CallSubDelayed2(FirebaseMessaging, "mandaLocFM", loc)
+ guardaInfoEnBD(loc)'Escribimos coordenadas y fecha a una bd
+End Sub
+
Sub ConvertMillisecondsToString(t As Long) As String 'ignore
Dim hours, minutes, seconds As Int
hours = t / DateTime.TicksPerHour
@@ -197,15 +215,86 @@ Sub ConvertMillisecondsToString(t As Long) As String 'ignore
Return $"$1.0{hours}:$2.0{minutes}:$2.0{seconds}"$
End Sub
+'Convierte ticks a minutos.
+Sub ticksAMins(ts As Long) As Long 'ignore
+ Private m As Long = ((ts/1000)/60)
+ Return m
+End Sub
+
Sub bitacora(texto As String) 'ignore
+ revisaBD
' Log(fechaNormal(DateTime.now))
gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', '${texto}', '${fechaNormal(DateTime.now)}')"$)
End Sub
'Borramos renglones extra de la tabla de errores
-Sub borraArribaDe10000Bitacora 'ignore
+Sub borraArribaDeXXXBitacora(limite As Int) 'ignore
If Starter.logger Then LogColor("Recortamos la tabla de bitacora, limite de 10,000", Colors.Magenta)
- gps_hist.ExecNonQuery("DELETE FROM bitacora WHERE fecha NOT in (SELECT fecha FROM bitacora ORDER BY fecha desc LIMIT 9999 )")
+ gps_hist.ExecNonQuery($"DELETE FROM bitacora WHERE fecha NOT in (SELECT fecha FROM bitacora ORDER BY fecha desc LIMIT ${limite})"$)
gps_hist.ExecNonQuery("vacuum;")
' if starter.logger then Log("Borramos mas de 100 de errorLog")
-End Sub
\ No newline at end of file
+End Sub
+
+'Regresa la ultima ubicacion guardada o una ubicacion sin inicializar si no encuentra nada.
+Sub traeUltimaUbicacionGuardada As Location 'ignore
+ Private loc As Location
+ Private c As Cursor = gps_hist.ExecQuery($"select FECHA, LAT, LON, ACC, TIME from RUTA_GPS order by fecha desc limit 1"$)
+ If c.RowCount > 0 Then
+ c.Position = 0
+ loc.Initialize
+ loc.Latitude = c.GetString("LAT")
+ loc.Longitude = c.GetString("LON")
+ loc.Accuracy = 0
+ If c.GetString("ACC") <> Null Then loc.Accuracy = c.GetString("ACC")
+ loc.Time = 0
+ If c.GetString("TIME") <> Null Then loc.Time = c.GetString("TIME")
+ End If
+ c.Close
+ Return loc
+End Sub
+
+'Busca la ultima ubicacion guardada en la table GPS_HIST, y dependiendo del tiempo transcurrido hace lo siguiente:
+' - Mas de 10 minutos -> Pide actualzación de ubicacion.
+' - Mas de 20 minutos -> Apaga y prende el servicio de FLP.
+' - Mas de 30 minutos -> Reinicia la aplicación.
+Sub revisaYmandaUUC
+ Private ultimaLoc As Location = traeUltimaUbicacionGuardada
+ If ultimaLoc.IsInitialized Then
+ Starter.UUC = ultimaLoc
+ Private minsTranscurridos As String = ticksAMins(DateTime.Now - ultimaLoc.Time) 'Minutos transcurridos desde la ultima ubicacion guardada.
+ Log($"Ultima ubicacion guardada hace ${minsTranscurridos} mins."$)
+ If minsTranscurridos > 10 And minsTranscurridos < 20 Then
+ bitacora("Mas de 10 mins - REQ-UPDATE")
+ LogColor($"Ubicacion vieja (mas de 10 mins.)"$, Colors.Red)
+ LogColor("Pedimos actualizacion!", Colors.blue)
+ If Tracker.flp.IsInitialized And Tracker.locReqSmall.IsInitialized Then
+ bitacora("REQ-UPDATE") : LogColor("REQ-UPDATE", Colors.magenta)
+ Tracker.flp.RequestLocationUpdates(Tracker.locReqSmall)
+ Else
+ bitacora("TRACKER APAGADO - RESTART-TRACKER") : LogColor("RESTART-TRACKER", Colors.magenta)
+ StopService(Tracker)
+ Sleep(5000)
+ StartService(Tracker)
+ End If
+ else if minsTranscurridos >= 20 And minsTranscurridos < 30 Then
+ LogColor("RESTART-TRACKER", Colors.red)
+ bitacora("Mas de 20 mins - RESTART-TRACKER")
+' bitacora(Tracker.flp.SuspendedCause)
+ StopService(Tracker)
+ Sleep(5000)
+ StartService(Tracker)
+ else If minsTranscurridos >= 30 Then
+ If Tracker.flp.IsInitialized Then LogColor($"FLP.Connected: ${Tracker.flp.IsConnected}"$, Colors.Red)
+ If Tracker.flp.IsInitialized and Not(Tracker.flp.IsConnecting) Then 'Si NO esta en proceso de conectarse ...
+ LogColor("RESTART-APP", Colors.red)
+ bitacora("Mas de 30 mins - RESTART-APP")
+' bitacora(Tracker.flp.SuspendedCause) 'ignore
+ Starter.UUC.Time = DateTime.Now
+ guardaInfoEnBD(Starter.UUC) 'Guardamos la ultima ubicacion con la hora actual, para que no se reinicie la app si no consigue una ubicacion nueva.
+ Sleep(1000)
+ ExitApplication
+ End If
+ End If
+' LogColor($"Ultima loc: ${Subs.fechaNormal(ultimaLoc.Time)}"$, Colors.blue)
+ End If
+End Sub
diff --git a/Tracker.bas b/Tracker.bas
index b8dfb86..5807282 100644
--- a/Tracker.bas
+++ b/Tracker.bas
@@ -36,30 +36,40 @@ Sub Process_Globals
Private nid As Int = 1
Private Tracking As Boolean
Private lock As PhoneWakeState
- 'Para FusedLocationProvider (2 lineas)
Public flp As FusedLocationProvider
Private flpStarted As Boolean
Dim minAccuracy As Int = 50
Dim killerCalled As Int = 0
+ Dim locReqSmall As LocationRequest
End Sub
Sub Service_Create
Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_NEVER 'we are handling it ourselves
- 'Para FusedLocationProvider (2 lineas)
+ Subs.revisaBD
flp.Initialize("flp")
flp.Connect
lock.PartialLock
StartFLP
If Starter.logger Then Log("FLP initialized")
Subs.bitacora($"Iniciamos Tracker"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', 'Iniciamos Tracker', '${Subs.fechaKMT(DateTime.now)}')"$)
End Sub
+Sub Service_Start (StartingIntent As Intent)
+ locReqSmall = CreateLocationRequest2(1000, 0) 'ignore
+ Service.StopAutomaticForeground
+ Service.StartForeground(nid, Subs.CreateNotification("..."))
+ Track
+ StartServiceAt(Me, DateTime.Now + 60 * DateTime.TicksPerMinute, True)
+ Subs.bitacora($"Tracker - Service_Start"$)
+End Sub
+
+'Apagamos y prendemos sel servicio "Tracker" o reinicamos la aplicacion.
+'killerCalled = 0 -> Apagamos y prendemos.
+'killerCalled = 1 -> ExitApplication (se reinican todos los servicios).
Sub flpReConnect
Try
If killerCalled = 0 Then
killerCalled = 1
- Subs.bitacora("Llamamos RESTART-TRACKER")
CallSubDelayed(Starter, "restartTracker")
Else
Subs.bitacora("Llamamos EXIT-APP")
@@ -72,25 +82,16 @@ End Sub
Sub flp_ConnectionSuccess
Log("FLP - Connected to location provider")
- 'FLP.GetLastKnownLocation
+ Subs.bitacora("FLP - Connection Success")
End Sub
Sub flp_ConnectionFailed(ConnectionResult1 As Int)
Log("Failed to connect to location provider")
-End Sub
-
-Sub Service_Start (StartingIntent As Intent)
- 'Para FusedLocationProvider (1 linea)
- Service.StopAutomaticForeground
- Service.StartForeground(nid, Subs.CreateNotification("..."))
- Track
- StartServiceAt(Me, DateTime.Now + 10 * DateTime.TicksPerMinute, True)
- Subs.bitacora($"Tracker - Service_Start"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', 'Tracker - Service_Start', '${Subs.fechaKMT(DateTime.now)}')"$)
+ Subs.bitacora("FLP - Connection Failed")
End Sub
Public Sub Track
- 'Log("Track")
+ If Starter.logger Then Log("Track")
If Tracking Then Return 'Si ya estamos "rastreando" no hacemos nada (return)
If Starter.rp.Check(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION) = False Then
Log("No permission")
@@ -110,21 +111,17 @@ Public Sub StartFLP
cont = cont + 1
If cont > 70 Then
cont = 0
- Log("Reiniciamos FLP")
- flpReConnect
+ LogColor("Reiniciamos FLP", Colors.red)
+ killerCalled = 1 : flpReConnect
End If
Loop
-' If flpStarted = False Then
-' Log("RequestLocationUpdates")
-' Starter.FLPStatus = "Searching" : LogColor("FLP Searching", Colors.blue)
flp.RequestLocationUpdates(CreateLocationRequest) 'Buscamos ubicacion
flpStarted = True
' End If
End Sub
-Private Sub CreateLocationRequest As LocationRequest
+Sub CreateLocationRequest As LocationRequest
' Log("CreateLocationRequest")
-' Starter.FLPStatus = "Searching" : LogColor("FLP Searching", Colors.blue)
Dim lr As LocationRequest
lr.Initialize
lr.SetInterval(30000) 'Intervalo deseado para actualizaciones de ubicacion en milisegundos
@@ -134,21 +131,19 @@ Private Sub CreateLocationRequest As LocationRequest
Return lr
End Sub
-Sub dameUltimaUbicacionConocida(lastLocation As Location) 'ignore
- If Starter.logger Then LogColor("dameUltimaUbicacionConocida", Colors.Magenta)
-' Subs.gps_hist.ExecNonQuery("CREATE TABLE IF NOT EXISTS RUTA_GPS(FECHA INTEGER, LAT TEXT, LON TEXT)")
- If Starter.logger Then Log("This accuracy: " & Starter.UUC.Accuracy)
- Subs.bitacora($"Enviamos UUC - Acc: ${Starter.UUC.Accuracy}, Time:${Starter.UUC.Time}"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', 'Enviamos UUC - Acc: ${Starter.UUC.Accuracy}, Time:${Starter.UUC.Time}', '${Subs.fechaKMT(DateTime.now)}')"$)
- Subs.mandaLocAServer(Starter.UUC, Starter.devModel)
- FirebaseMessaging.locRequest = "Activa"
- CallSubDelayed2(FirebaseMessaging,"mandamosLoc", Starter.UUC)
- If Starter.logger Then Log("Mandamos GetLastKnownLocation : "&DateTime.Time(flp.GetLastKnownLocation.Time))
- If Starter.logger Then Log($"UUC: ${Starter.UUC.Latitude},${Starter.UUC.Longitude}"$)
+Sub CreateLocationRequest2(interval0 As Int, displacement0 As Int) As LocationRequest 'ignore
+' Log("CreateLocationRequestSmall")
+ Dim lr As LocationRequest
+ lr.Initialize
+ lr.SetInterval(interval0) 'Intervalo deseado para actualizaciones de ubicacion en milisegundos
+ lr.SetFastestInterval(lr.GetInterval / 2) 'Intervalo minimo para actualizaciones de ubicacion
+ lr.SetSmallestDisplacement(displacement0) 'Solo registra cambio de ubicacion si es mayor a XX mts
+ lr.SetPriority(lr.Priority.PRIORITY_HIGH_ACCURACY)
+ Return lr
End Sub
Public Sub StopFLP
- 'Log("StopFLP")
+ If Starter.logger Then Log("StopFLP")
If flpStarted Then
flp.RemoveLocationUpdates 'Eliminamos todas las solicitudes de ubicacion
flpStarted = False
@@ -156,35 +151,39 @@ Public Sub StopFLP
End Sub
Sub flp_LocationChanged (Location1 As Location)
-' Starter.FLPStatus = "Location changed" : LogColor("Location changed", Colors.blue)
+ LogColor($"Location Changed - Acc: ${Location1.Accuracy}"$, Colors.blue)
Dim el_texto As String = ""
Starter.UUC = Location1
- If Not(Starter.Timer1.Enabled) Then
- Starter.Timer1.Enabled = True
- Log("FLP - Timer Enabled")
- End If
+ flp.RequestLocationUpdates(CreateLocationRequest)
If Starter.logger Then LogColor("FLP_LocationChanged", Colors.Red)
-' ToastMessageShow("FLP_LocationChanged", False)
- Main.laUbicacion = Location1
-' ToastMessageShow(coords, False)
-' Log("Mandamos Ubicacion")
- If Starter.logger Then Log(FirebaseMessaging.locRequest)
- If Starter.logger Then Log(Location1)
If Starter.logger Then Log(Location1.Accuracy&" - "&Location1.AccuracyValid)
- ' solo mandamos la ubicacion si la precision es dentro de XX mts
el_texto = $"LocChange - Coords NO enviadas (Acc:${Location1.Accuracy})."$
+ 'Solo mandamos la ubicacion si la precision es dentro de XX mts
If Location1.Accuracy < minAccuracy Then
- Subs.mandaLocAServer(Location1, Starter.devModel)
- FirebaseMessaging.locRequest = "Activa"
- CallSubDelayed2(FirebaseMessaging,"mandamosLoc", Location1)
+ Subs.mandaLoc2(Location1, Starter.devModel)
el_texto = $"LocChange - Coords enviadas (Acc:${Location1.Accuracy})."$
End If
- If Starter.logger Then Log("Loc changed : "&Location1.Latitude&","&Location1.Longitude&"|"&Starter.devModel&"|")
- Subs.gps_hist.ExecNonQuery("CREATE TABLE IF NOT EXISTS BITACORA(RUTA TEXT, TEXTO TEXT, FECHA TEXT)")
+' If Starter.logger Then Log("Loc changed : "&Location1.Latitude&","&Location1.Longitude&"|"&Starter.devModel&"|")
Subs.bitacora($"${el_texto}"$)
- ToastMessageShow(el_texto, False)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', '${el_texto}', '${Subs.fechaKMT(DateTime.now)}')"$)
- CallSubDelayed(Main, "ponCoords")
+End Sub
+
+Sub flp_ConnectionSuspended(SuspendedCause1 As Int)
+ Dim Cause As String
+ Log("ConnectionSuspended")
+ Subs.bitacora("ConnectionSuspended")
+ If(SuspendedCause1=flp.SuspendedCause.CAUSE_NETWORK_LOST) Then
+ Cause="Suspended by NetworkLost"
+ Else If(SuspendedCause1=flp.SuspendedCause.CAUSE_SERVICE_DISCONNECTED) Then
+ Cause="Suspended by Disconnected"
+ Else
+ Cause="Suspended: Unknow cause"
+ End If
+ Cause = Cause&": "& Subs.fechaNormal(DateTime.Now)
+ LogColor(Cause, Colors.magenta)
+ Subs.bitacora(Cause)
+ flp.Disconnect
+ Sleep(5000)
+ flp.Connect
End Sub
Sub Service_Destroy
@@ -194,5 +193,4 @@ Sub Service_Destroy
Tracking = False
lock.ReleasePartialLock
Subs.bitacora($"Tracker - Service_Destroy"$)
-' Subs.gps_hist.ExecNonQuery($"insert into BITACORA (RUTA, TEXTO, FECHA) values ('${Starter.devModel}', 'Tracker - Service_Destroy', '${Subs.fechaKMT(DateTime.now)}')"$)
End Sub
diff --git a/test.bas b/test.bas
new file mode 100644
index 0000000..227d834
--- /dev/null
+++ b/test.bas
@@ -0,0 +1,16 @@
+B4A=true
+Group=Default Group
+ModulesStructureVersion=1
+Type=Receiver
+Version=12.5
+@EndOfDesignText@
+Sub Process_Globals
+
+End Sub
+
+'Called when an intent is received.
+'Do not assume that anything else, including the starter service, has run before this method.
+Private Sub Receiver_Receive (FirstTime As Boolean, StartingIntent As Intent)
+
+End Sub
+