B4A=true Group=Default Group ModulesStructureVersion=1 Type=StaticCode Version=11 @EndOfDesignText@ 'Code module 'Subs in this code module will be accessible from all modules. Sub Process_Globals 'These global variables will be declared once when the application starts. 'These variables can be accessed from all modules. Public GZip As GZipStrings Private su As StringUtils Dim phn As Phone Dim devModel As String Dim gps_hist As SQL Dim wifi As MLwifi Dim ssid As String End Sub Sub getPhnId 'Pone el valor de phn.Model en la variable global "devModel" Private elId As String If File.Exists(File.DirInternal, "phnId.txt") Then elId = File.ReadString(File.DirInternal, "phnId.txt") Else File.WriteString(File.DirInternal, "phnId.txt", "") 'Creamos el archivo End If If elId.Length < 3 Then 'Si el modelo del archivo es menos de 2, lo sustituimos con devmodel devModel = phn.Model If devModel.Length > 1 Then elId = devModel End If If elId.Length < 3 Then 'Si el modelo del archivo es menos de 2, lo sustituimos con android_id elId = phn.GetSettings("android_id") 'Intentamos con "android_id" 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") Starter.devModel = elId ' If Starter.logger Then Log(Starter.devModel) End Sub Sub compress(str As String) As String ' Compresion Dim compressed() As Byte = GZip.compress(str) If Starter.logger Then Log($"CompressedBytesLength: ${compressed.Length}"$) Dim base64 As String = su.EncodeBase64(compressed) If Starter.logger Then Log($"CompressedBytes converted to base64 Length: ${base64.Length}"$) If Starter.logger Then Log($"CompressedBytes converted to base64: ${base64}"$) Return base64 End Sub Sub decompress(base64 As String) As String ' Descompresion 'ignore Dim decompressedbytes() As Byte = su.DecodeBase64(base64) If Starter.logger Then Log($"decompressedbytesLength: ${decompressedbytes.Length}"$) Dim bc As ByteConverter Dim uncompressed As String = bc.StringFromBytes(decompressedbytes,"UTF8") If Starter.logger Then Log($"uncompressedLength: ${uncompressed.Length}"$) If Starter.logger Then Log($"Decompressed String = ${uncompressed}"$) Return uncompressed 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 Sub CreateNotification (Body As String) As Notification Dim notification As Notification notification.Initialize2(notification.IMPORTANCE_LOW) notification.Icon = "icon" notification.SetInfo("FLP", Body, Main) Return notification End Sub Sub guardaInfoEnArchivo(coords As String) 'Escribimos coordenadas y fecha a un archivo de texto 'ignore ' Cambiamos el formato de la hora Dim OrigFormat As String=DateTime.DateFormat 'save orig date format DateTime.DateFormat="MMM-dd HH:mm:ss" Dim lastUpdate As String=DateTime.Date(DateTime.Now) DateTime.DateFormat=OrigFormat 'return to orig date format Dim ubic As String = coords&","&lastUpdate Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "gps.txt", True) Dim s As String = ubic & CRLF Dim t() As Byte = s.GetBytes("UTF-8") out.WriteBytes(t, 0, t.Length) out.Close End Sub '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(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 = "" If c.RowCount>0 Then For i=0 To c.RowCount -1 c.Position=i ruta2=ruta2&CRLF&c.GetString("LAT")&","&c.GetString("LON") Main.fechaRuta = c.GetString("FECHA") Next End If c.Close Return compress(ruta2) End Sub Sub deleteGPS_DB ' gps_hist.ExecQuery gps_hist.ExecNonQuery("delete from RUTA_GPS") gps_hist.ExecNonQuery("vacuum;") If Starter.logger Then Log("RUTA_GPS borrada") End Sub Sub borramosArchivoGPS Dim out As OutputStream = File.OpenOutput(File.DirRootExternal, "gps.txt", False) Dim s As String = "" Dim t() As Byte = s.GetBytes("UTF-8") out.WriteBytes(t, 0, t.Length) out.Close End Sub Sub revisaBD 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) If Not(Starter.errorLog.IsInitialized) Then Starter.errorLog.Initialize(File.DirInternal, "errorLog.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 If wifi.isWifiConnected Then ssid = wifi.WifiSSID End If End Sub 'Convierte una fecha al formato yyMMddHHmmss Sub fechaKMT(fecha As String) As String 'ignore ' Log(fecha) Dim OrigFormat As String = DateTime.DateFormat 'save orig date format DateTime.DateFormat="yyMMddHHmmss" Dim nuevaFecha As String=DateTime.Date(fecha) DateTime.DateFormat=OrigFormat 'return to orig date format ' Log(nuevaFecha) 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 If Starter.logger Then Log("Formato de fecha incorrecto, debe de ser 'YYMMDDHHMMSS', no '"&fKMT&"' largo="&fKMT.Length) Return 0 End If Catch Log("FLP-fechaKMT2Ticks Error -> " & LastException) If Starter.logger Then 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) Dim OrigFormat As String = DateTime.DateFormat 'save orig date format DateTime.DateFormat="MM/dd HH:mm:ss" Dim nuevaFecha As String = DateTime.Date(fecha) DateTime.DateFormat=OrigFormat 'return to orig date format Return nuevaFecha End Sub Sub mandaLocAServer(loc As Location, id As String) Starter.lastLocUpdate = DateTime.Now If Not(IsPaused(Main)) Then CallSubDelayed(Main, "actualizaLabelUU") Starter.cmd.Initialize Starter.cmd.Name = "guardaDatos" Starter.cmd.Parameters = Array As Object(fechaKMT(DateTime.Now), id, fechaKMT(DateTime.Now), $"${loc.Latitude},${loc.Longitude},${loc.Accuracy},${loc.AccuracyValid},${loc.Speed},${loc.SpeedValid}"$, "Coords") ' If Starter.logger Then If Starter.logger Then Log($">>>> Mandamos loc a server: ${fechaKMT(DateTime.Now)}|${id}|${fechaKMT(DateTime.Now)}|${loc.Latitude},${loc.Longitude}|Coords"$) ' End If 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 minutes = (t Mod DateTime.TicksPerHour) / DateTime.TicksPerMinute seconds = (t Mod DateTime.TicksPerMinute) / DateTime.TicksPerSecond 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 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 ${limite})"$) gps_hist.ExecNonQuery("vacuum;") ' if starter.logger then Log("Borramos mas de 100 de errorLog") 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. if starter.logger then 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.flp.IsConnected And Tracker.locReqSmall.IsInitialized Then bitacora("REQ-UPDATE") : LogColor("REQ-UPDATE", Colors.magenta) Try Tracker.flp.RequestLocationUpdates(Tracker.locReqSmall) Catch Log(LastException) End Try 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) StopService(Tracker) Sleep(5000) StartService(Tracker) CallSubDelayed(Tracker, "StartFLP") ' ExitApplication End If End If ' LogColor($"Ultima loc: ${Subs.fechaNormal(ultimaLoc.Time)}"$, Colors.blue) End If End Sub