B4A=true Group=Default Group ModulesStructureVersion=1 Type=Service Version=10.2 @EndOfDesignText@ '/////////////////////////////////////////////////////////////////////////////////////// '/// Agregar estas lineas al editor de manifiestos ' ' CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase) ' CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase) ' CreateResourceFromFile(Macro, FirebaseAnalytics.FirebaseAnalytics) ' CreateResourceFromFile(Macro, FirebaseNotifications.FirebaseNotifications) ' '/// Agregar modulo de servicio nuevo FirebaseMessaging y copiar este modulo ' '/// Bajar el archivo google-services.json de la consola de Firebase (https://console.firebase.google.com/) '/// El nombre de la app en el archivo json tiene que ser el mismo que el nombre del paquete (Proyecto/Conf de Compilacion/Paquete) ' '/// En Starter agregar esta linea ' ' Sub Service_Create ' CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") ' End Sub ' '/// En Main en Sub Process_Globals agregar esta linea ' ' Private const API_KEY As String = "AAAAv__xxxxxxxxxxxxx-xxxxxxxxxxxxxx-xxxxxxxxxxxx" ' '/// Esta llave se consigue igualmente en la consola de Firebase, configuracion de proyecto, Cloud Messaging, '/// es la clave de servidor. '/// '/// Se necesitan agregar las librerías: FirebaseAnalitics, FirebaseNotifications, JSON y OkHttpUtils2 '/// ... JSON es necesario si se van a enviar mensajes, si solo se van a recibir, no es necesario. ' '/////////////////////////////////////////////////////////////////////////////////////// Sub Process_Globals Private fm As FirebaseMessaging Private const API_KEY As String = "AAAAv1qt3Lk:APA91bECIR-pHn6ul53eYyoVlpPuOo85RO-0zcAgEXwE7vqw8DFSbBtCaCINiqWQAkBBZXxHtQMdpU6B-jHIqgFKVL196UgwHv0Gw6_IgmipfV_NiItjzlH9d2QNpGLp9y_JUKVjUEhP" ' Dim phn As Phone ' Dim devModel As String Dim pe As PhoneEvents Dim c As Cursor Public GZip As GZipStrings 'Requiere la libreria CompressStrings Dim Subscrito As String = "" Dim au As String Dim puntosRuta As Int = 380 End Sub Sub Service_Create fm.Initialize("fm") 'Inicializamos FirebaseMessaging pe.Initialize("pe") 'Para obtener la bateria End Sub Public Sub SubscribeToTopics fm.SubscribeToTopic("Trckr") 'Global (you can subscribe to more topics) fm.SubscribeToTopic("Trckr-GunaReparto") 'Global (you can subscribe to more topics) If Main.usuario <> Subscrito Then fm.SubscribeToTopic(Main.usuario) 'Propio (you can subscribe to more topics) fm.UnsubscribeFromTopic(Subscrito) 'Unsubscribe from topic End If If Main.logger Then Log("Subscrito a FM "&Main.usuario) Subscrito = Main.usuario ' Log(fm.token) ' fm.UnsubscribeFromTopic("Sprvsr") 'Unsubscribe from topic ' fm.UnsubscribeFromTopic("Trckr") 'Unsubscribe from topic End Sub Sub Service_Start (StartingIntent As Intent) LogColor("Iniciamos FirebaseMessaging", Colors.Green) If StartingIntent.IsInitialized Then fm.HandleIntent(StartingIntent) Sleep(0) Service.StopAutomaticForeground 'remove if not using B4A v8+. StartServiceAt(Me, DateTime.Now + 15 * DateTime.TicksPerMinute, True) 'Iniciamos servicio cada XX minutos End Sub Sub fm_MessageArrived (Message As RemoteMessage) If Main.logger Then Log("Message arrived") If Main.logger Then Log($"Message data: ${Message.GetData}"$) ' getPhnId If Message.GetData.ContainsKey("t") Then Dim tipos As List = Regex.Split(",",Message.GetData.Get("t")) If tipos.IndexOf("pu") <> -1 Or tipos.IndexOf("au") <> -1 Then 'Si es una peticion de ubicacion If Main.logger Then Log("Es una peticion de ubicacion") Tracker.locRequest="Activa" If Main.logger Then Log("Llamamos StartFLP") ' CallSubDelayed(Tracker, "StartFLP") CallSubDelayed(Tracker, "StartFLP") End If If tipos.IndexOf("au") <> -1 Then 'Si es una actualizacion de ubicacion au = 1 End If If tipos.IndexOf("ping") <> -1 Then 'Si es un ping If Main.logger Then Log("Es un ping") If Main.logger Then Log("Mandamos pong") Dim params As Map = CreateMap("topic":"Sprv-GunaReparto","title":"pong", "body":Main.usuario&" - Recibi mensaje "&Message.GetData.Get("title"), "t":"pong") SendMessage(params) End If If tipos.IndexOf("bgps") <> -1 Then 'Si es una instruccion de borrar archivo gps If Main.logger Then Log("Es una instruccion de borrar archivo gps") If Main.logger Then Log("Borramos archivo gps") borramosArchivoGPS End If If tipos.IndexOf("dr") <> -1 Then 'Si es una peticion de ruta gps If Main.logger Then Log("Es una peticion de Ruta GPS") Dim rutaGpsCmp As String = dameRuta Dim params As Map = CreateMap("topic":"Sprv-GunaReparto","title":"ruta", "body":Main.usuario&" - Recibi mensaje "&Message.GetData.Get("title"), "t":"ruta", "r":rutaGpsCmp) SendMessage(params) End If If tipos.IndexOf("bgps2") <> -1 Then 'Si es una instruccion de borrar DB gps If Main.logger Then Log("Es una instruccion de borrar BD gps") If Main.logger Then Log("Borramos BD gps") borraGPSHist End If If tipos.IndexOf("pu") = -1 And tipos.IndexOf("au") = -1 And tipos.IndexOf("ping") = -1 And tipos.IndexOf("dr") = -1 Then If Main.logger Then Log("No es ping ni solicitud de ubicacion o ruta, entonces no hacemos nada") End If End If End Sub Sub Service_Destroy End Sub Sub SendMessage(params As Map) Dim topic As String= params.Get("topic") Dim title As String= params.Get("title") Dim body As String= params.Get("body") Dim tipo As String= params.Get("t") If params.ContainsKey("r") Then If Main.logger Then Log("Con ruta") Dim rutaGpsCmp As String= params.Get("r") Else If Main.logger Then Log("Sin ruta") Dim rutaGpsCmp As String = "" End If Dim Job As HttpJob Job.Initialize("fcm", Me) Dim m As Map = CreateMap("to": $"/topics/${topic}"$) Dim data As Map = CreateMap("title":title, "body":body, "d":Main.usuario, "t":tipo, "b":Main.batt, "mt":Main.montoActual, "r":rutaGpsCmp, "v":Application.VersionName) m.Put("data", data) Dim jg As JSONGenerator jg.Initialize(m) Job.PostString("https://fcm.googleapis.com/fcm/send", jg.ToString) Job.GetRequest.SetContentType("application/json;charset=UTF-8") Job.GetRequest.SetHeader("Authorization", "key=" & API_KEY) If Main.logger Then Log(m) End Sub Sub mandamosLoc(coords As String) If Main.logger Then Log("Iniciamos mandamosLoc "&coords) ' If Main.logger Then Log("Tracker.locRequest="&Tracker.locRequest) Dim t As String If Tracker.locRequest="Activa" Then 'Si hay solicitud de ubicacion, entonces la mandamos ... If au = 1 Then t = "au" ' es una actualizacion Else t = "u" ' es una peticion End If Dim params As Map = CreateMap("topic":"Sprv-GunaReparto","title":"ubicacionRecibida", "body":coords, "t":t) SendMessage(params) Tracker.locRequest="Enviada" CallSubDelayed(Tracker,"CreateLocationRequest") End If 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 If Main.logger Then Log("Guardamos ubicacion en db") Dim latlon() As String = Regex.Split(",", coords) Try Starter.skmt.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1))) Catch If Main.logger Then Log("Error guardando ubicacion") 'Si la horaMinSeg es el mismo no lo guarda End Try ' c=Main.skmt.ExecQuery("select * from RUTA_GPS") ' c.Position =0 ' Log(c.GetString("lat")&","&c.GetString("lon")&","&c.GetString("fecha")) ' 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 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 getPhnId 'Pone el valor de phn.Model en la variable global "devModel" ' devModel = phn.Model ' If devModel.Length <= 3 Then 'Si phn.Model esta en blanco ... ' Dim t As String = phn.GetSettings("android_id") 'Intentamos con "android_id" ' devModel = t ' End If ' If devModel.Length >= 3 Then 'Si tenemos valor para phn.Model ' File.WriteString(File.DirInternal, "phnId.txt", devModel) 'Sobreescribimos archivo phnId.txt with deviceId ' Log("Tenemos phnId: "&devModel&" "&File.DirInternal&"/phn.txt sobreescrito") ' Else If devModel.Length < 2 Then ' Si no tenemos valor, lo leemos de phnId.txt ' Dim s As String = File.ReadString(File.DirInternal, "phnId.txt") ' devModel = s ' Log("Leemos id de "&File.DirInternal&"/phnId.txt") ' Log(devModel) ' End If 'End Sub Sub pe_BatteryChanged (Level As Int, Scale As Int, Plugged As Boolean, Intent As Intent) Main.batt=Level End Sub Sub compress(str As String) As String ' Compression Private su As StringUtils Dim compressed() As Byte = GZip.compress(str) If Main.logger Then Log($"CompressedBytesLength: ${compressed.Length}"$) Dim base64 As String = su.EncodeBase64(compressed) If Main.logger Then Log($"CompressedBytes converted to base64 Length: ${base64.Length}"$) If Main.logger Then Log($"CompressedBytes converted to base64: ${base64}"$) Return base64 End Sub Sub decompress(base64 As String) As String 'ignore ' Decompression Private su As StringUtils Dim decompressedbytes() As Byte = su.DecodeBase64(base64) If Main.logger Then Log($"decompressedbytesLength: ${decompressedbytes.Length}"$) Dim bc As ByteConverter Dim uncompressed As String = bc.StringFromBytes(decompressedbytes,"UTF8") If Main.logger Then Log($"uncompressedLength: ${uncompressed.Length}"$) ' 6163 Bytes If Main.logger Then Log($"Decompressed String = ${uncompressed}"$) Return uncompressed End Sub Sub dameRuta As String If Main.logger Then Log("dameRuta") Dim OrigFormat As String = DateTime.DateFormat 'save orig date format DateTime.DateFormat="yyMMdd" ' Dim lastUpdate As String=DateTime.Date(fecha) Dim hoy As String = DateTime.Date(DateTime.Now)&"000000" DateTime.DateFormat=OrigFormat 'return to orig date format If Main.logger Then Log(hoy) Dim c As Cursor c = Starter.skmt.ExecQuery("select LAT, LON from RUTA_GPS where fecha > "& hoy &" order by fecha desc limit "&puntosRuta) 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") Next End If c.Close Return compress(ruta2) End Sub Sub borraGPSHist c=Starter.skmt.ExecQuery("select count(*) as cuantos FROM RUTA_GPS") c.Position=0 If Main.logger Then Log("Habia "&c.GetInt("cuantos")) Starter.skmt.ExecNonQuery("delete from RUTA_GPS") c=Starter.skmt.ExecQuery("select count(*) as cuantos FROM RUTA_GPS") c.Position=0 Log("Quedaron " & c.GetInt("cuantos")) Log("Borramos RUTA_GPS") c.Close End Sub