B4A=true Group=Default Group ModulesStructureVersion=1 Type=Service Version=9.85 @EndOfDesignText@ #Region Service Attributes #StartAtBoot: False #ExcludeFromLibrary: 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. Public gps As GPS Dim skmt As SQL Dim s As C_Subs Dim ph As Phone Public rp As RuntimePermissions Public FLP As FusedLocationProvider ' Private flpStarted As Boolean Dim reqManager As DBRequestManager Dim DBReqServer As String = "http://187.189.244.154:1781" ' Dim DBReqServer As String = "http://11.0.0.119:1781" ' Dim DBReqServer As String = "http://10.0.0.205:1783" ' Dim DBReqServer As String = "http://192.168.100.10:1781" Dim Timer1, tConexion As Timer Dim Interval As Int = 300 Dim IntervalC As Int = 10 Dim ruta As String = File.DirInternal 'Para los Logs Private logs As StringBuilder Private logcat As LogCat Dim muestraProgreso = 0 Dim logger As Boolean = False Dim marcaCel As String = ph.manufacturer Dim tabla As String Dim MAC_IMPRESORA As String Dim utimaPagina As String Dim senial As Int = 1 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. gps.Initialize("GPS") s.Initialize(Me, "Subs") 'Inicializamos la clase Subs skmt = s.inicializaBD(File.DirInternal, "kmt.db") ' CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") 'Para Push FirebaseMessaging tConexion.Initialize("tConexion", IntervalC * 1000) tConexion.Enabled = True Timer1.Initialize("Timer1", Interval * 1000) Timer1.Enabled = True ' 'Para los Logs #if RELEASE logcat.LogCatStart(Array As String("-v","raw","*:F","B4A:v"), "logcat") #end if logs.Initialize ' CallSubDelayed(FirebaseMessaging, "SubscribeToTopics") 'Para Push FirebaseMessaging End Sub Sub Service_Start (StartingIntent As Intent) Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases. Subs.revisaBD ' Log(marcaCel) If s.traeDBReqServerDeBD(skmt) <> "N/A" And s.traeDBReqServerDeBD(skmt) <> "" Then DBReqServer = s.traeDBReqServerDeBD(skmt) reqManager.Initialize(Me, DBReqServer) Log($"Starter - |${DBReqServer}|"$) ' Dim ctxt As JavaObject ' ctxt.InitializeContext ' Dim TelephonyManager As JavaObject = ctxt.RunMethod("getSystemService", Array("phone")) ' Dim listener As JavaObject ' listener.InitializeNewInstance(Application.PackageName & ".starter.ResilientPhoneListener", Null) ' TelephonyManager.RunMethod("listen", Array(listener, 0x00000100)) End Sub Private Sub Timer1_Tick ' Log("Next run " & DateTime.Time(DateTime.Now + Interval * 1000)) ENVIA_ULTIMA_GPS End Sub Private Sub tConexion_Tick ' Log("Next run " & DateTime.Time(DateTime.Now + Interval * 1000)) ' ENVIA_ULTIMA_GPS Dim cmd As DBCommand cmd.Initialize cmd.Name = "select_fecha" B4XPages.MainPage.reqManager.ExecuteQuery(cmd , 0, "ping") 'Usamos el "reqManager" de Mainpage para que usar el jobDone de ahi!! ' Log("tConexion") End Sub Sub GPS_LocationChanged (Location1 As Location) ' CallSub2(Main, "GPS_LocationChanged", Location1) End Sub Sub Service_TaskRemoved 'This event will be raised when the user removes the app from the recent apps list. End Sub Sub Service_Destroy End Sub Sub ENVIA_ULTIMA_GPS Dim logger As Boolean = True If logger Then LogColor("Iniciamos ENVIA_ULTIMA_GPS", Colors.Magenta) Dim cmd As DBCommand ' cmd.Initialize ' cmd.Name = "select_fechat" ' B4XPages.MainPage.reqManager.ExecuteQuery(cmd , 0, "fechat") Dim cmd As DBCommand cmd.Initialize cmd.Name = "UPDATE_INTMEX_ACTUAL3_GPS" If B4XPages.MainPage.lat_gps.Length < 15 Then B4XPages.MainPage.lat_gps = B4XPages.MainPage.lat_gps&"0" cmd.Parameters = Array As Object(B4XPages.MainPage.montoActual, B4XPages.MainPage.clientestotal, B4XPages.MainPage.clientesventa,B4XPages.MainPage.clientesvisitados,B4XPages.MainPage.lat_gps,B4XPages.MainPage.lon_gps,B4XPages.MainPage.batt,0, 0, 0, Application.VersionName,senial,B4XPages.MainPage.ALMACEN,B4XPages.MainPage.rutapreventa) If logger Then Log($"montoActual: ${B4XPages.MainPage.montoActual}, cTotal: ${B4XPages.MainPage.clientestotal}, cVenta: ${B4XPages.MainPage.clientesventa}, cVisitados: ${B4XPages.MainPage.clientesvisitados}, ${B4XPages.MainPage.lat_gps}, ${B4XPages.MainPage.lon_gps}, Batt: ${B4XPages.MainPage.batt}, 0, 0, 0, ${Application.VersionName},${senial},Almacen: ${B4XPages.MainPage.ALMACEN}, Ruta: ${B4XPages.MainPage.rutapreventa}"$) reqManager.ExecuteCommand(cmd, "inst_visitas") skmt.ExecNonQuery2("Update cat_variables set CAT_VA_VALOR = ? WHERE CAT_VA_DESCRIPCION = ?" , Array As String(DateTime.Time(DateTime.Now),"HoraIngreso")) 'Reiniciamos el timer para cuando llamamos el Sub desde "seleccion" Timer1.Enabled = False Timer1.Interval = Interval * 1000 Timer1.Enabled = True End Sub 'Para los Logs Private Sub logcat_LogCatData (Buffer() As Byte, Length As Int) logs.Append(BytesToString(Buffer, 0, Length, "utf8")) If logs.Length > 4000 Then logs.Remove(0, logs.Length - 2000) 'Obtenemos log de 2000 ~ 4000 chars End If End Sub 'Return true to allow the OS default exceptions handler to handle the uncaught exception. 'Para los Logs Sub Application_Error (Error As Exception, StackTrace As String) As Boolean 'wait for 500ms to allow the logs to be updated. Dim jo As JavaObject Dim l As Long = 500: jo.InitializeStatic("java.lang.Thread").RunMethod("sleep", Array(l)) 'Sleep 500ms logcat.LogCatStop logs.Append(StackTrace) Subs.revisaBD Subs.errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (Subs.fechaKMT(DateTime.now), logs)) Return True End Sub 'Inicializa el reqServer con la dirección dada y lo guarda en CAT_VARIABLES. Sub reinicializaReqManager(srv As String) skmt.ExecNonQuery2("delete from CAT_VARIABLES where CAT_VA_DESCRIPCION = ?", Array As Object ("SERVER")) skmt.ExecNonQuery2("INSERT INTO CAT_VARIABLES(CAT_VA_DESCRIPCION, CAT_VA_VALOR) VALUES (?,?)", Array As Object ("SERVER", srv)) DBReqServer = srv reqManager.Initialize(Me, srv) LogColor(srv, Colors.red) End Sub Sub Signal_Changedx (SignalStrengh As Object) Dim s2 As JavaObject = SignalStrengh Private theSignal As String = s2.RunMethod("getGsmSignalStrength", Null) Log(theSignal) ToastMessageShow(theSignal, False) End Sub 'Sub Signal_Changed (strength As Int) ' Log($"Intensidad de señal recibida: ${strength}"$) ' ToastMessageShow($"Intensidad de señal recibida: ${strength}"$, False) ' ' Procesar el valor según el tipo de red ' If strength >= 0 And strength <= 31 Then ' ' GSM: convertir a dBm aproximado ' Dim dBm As Int = -113 + strength * 2 ' Log($"Señal GSM: ${strength} (~${dBm} dBm)"$) ' ToastMessageShow($"Señal GSM: ${strength} (~${dBm} dBm)"$, False) ' Else If strength < 0 Then ' ' CDMA/LTE: ya está en dBm ' Log($"Señal CDMA/LTE: ${strength} dBm"$) ' ToastMessageShow($"Señal GSM: ${strength} (~${dBm} dBm)"$, False) ' Else If strength = 99 Then ' Log("Señal desconocida o error") ' ToastMessageShow("Señal desconicida", False) ' End If 'End Sub 'if Java ' 'import android.telephony.*; 'import android.os.Build; 'Public static class MyPhoneStateListener extends PhoneStateListener { 'Public MyPhoneStateListener() { '} 'Public void onSignalStrengthsChanged(SignalStrength signalStrength) { ' anywheresoftware.b4a.BA.Log("onSignalStrengthsChanged"); ' ' int strengthValue; ' ' Try { ' If (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ' strengthValue = signalStrength.getLevel(); // 0-4 ' } Else { ' If (signalStrength.isGsm()) { ' strengthValue = signalStrength.getGsmSignalStrength(); // 0-31, 99 es desconocido ' } Else { ' strengthValue = signalStrength.getCdmaDbm(); ' } ' } ' ' // Pasar solo el valor entero, no el objeto SignalStrength completo ' starter.processBA.raiseEventFromUI(Null, "signal_changed", strengthValue); ' ' } Catch (Exception e) { ' anywheresoftware.b4a.BA.Log("Error: " + e.getMessage()); ' starter.processBA.raiseEventFromUI(Null, "signal_changed", 99); // Valor por defecto en caso de error ' } '} '} 'End If #if Java import android.telephony.*; import android.os.Build; public static class ResilientPhoneListener extends PhoneStateListener { private long lastUpdate = 0; @Override public void onSignalStrengthsChanged(SignalStrength signalStrength) { lastUpdate = System.currentTimeMillis(); anywheresoftware.b4a.BA.Log("onSignalStrengthsChanged"); int strengthValue; try { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { strengthValue = signalStrength.getLevel(); } else { if (signalStrength.isGsm()) { strengthValue = signalStrength.getGsmSignalStrength(); } else { strengthValue = signalStrength.getCdmaDbm(); } } starter.processBA.raiseEventFromUI(null, "signal_changed", strengthValue); } catch (Exception e) { starter.processBA.raiseEventFromUI(null, "signal_changed", 99); } } public boolean isAlive() { return (System.currentTimeMillis() - lastUpdate) < 120000; } } #End If