From 9312a2444670f0c39702280bea77b22ea0f06af0 Mon Sep 17 00:00:00 2001 From: cheveguerra Date: Sun, 24 Sep 2023 03:29:06 -0600 Subject: [PATCH] Commit iniical. --- .gitignore | 2 + B4A/B4AProject.b4a.meta | 24 + B4A/B4XImagenes.bas | 77 ++ B4A/B4XMainPage.bas | 410 +++++++++ B4A/B4XPage2.bas | 598 +++++++++++++ B4A/B4XPage3.bas | 77 ++ B4A/B4XPage4.bas | 24 + B4A/B4XReglas.bas | 609 +++++++++++++ B4A/DBRequestManager.bas | 271 ++++++ B4A/DBRequestManagerV1.bas | 271 ++++++ B4A/DBRequestManagerV2.bas | 149 ++++ B4A/Files/add.png | Bin 0 -> 4986 bytes B4A/Files/add2.png | Bin 0 -> 4829 bytes B4A/Files/chatbot6_191x191.png | Bin 0 -> 11826 bytes B4A/Files/chatbot7_191x191.png | Bin 0 -> 10721 bytes B4A/Files/contactitem.bal | Bin 0 -> 2595 bytes B4A/Files/editaregla.bal | Bin 0 -> 9085 bytes B4A/Files/errores.db | Bin 0 -> 24576 bytes B4A/Files/floatbutton_layout.bal | Bin 0 -> 1876 bytes B4A/Files/imagenes.bal | Bin 0 -> 3389 bytes B4A/Files/imgitem.bal | Bin 0 -> 2492 bytes B4A/Files/mainpage.bal | Bin 0 -> 9428 bytes B4A/Files/page2.bal | Bin 0 -> 9718 bytes B4A/Files/page3.bal | Bin 0 -> 2472 bytes B4A/Files/reglas.bal | Bin 0 -> 9718 bytes B4A/Files/reglas.db | Bin 0 -> 32768 bytes B4A/Files/robot-icons_2_191x191.png | Bin 0 -> 20449 bytes B4A/Files/robot3_191x191.png | Bin 0 -> 21967 bytes B4A/Files/robot4_191x191.png | Bin 0 -> 22305 bytes B4A/Files/robot8_191x191.png | Bin 0 -> 6645 bytes B4A/Files/robot_192x192.png | Bin 0 -> 31550 bytes B4A/Files/robotic_191x191.png | Bin 0 -> 7580 bytes B4A/Files/ruleitem.bal | Bin 0 -> 5938 bytes B4A/NotificationService.bas | 1042 +++++++++++++++++++++ B4A/ReplyAuto.b4a | 154 ++++ B4A/ReplyAuto.b4a.meta | 36 + B4A/Starter.bas | 102 +++ B4A/Subs.bas | 1092 +++++++++++++++++++++++ B4A/cvFloatingBtn.bas | 89 ++ B4A/reglas.bas | 13 + B4A/startWA.bas | 44 + B4i/B4iProject.b4i | 53 ++ B4i/B4iProject.b4i.meta | 15 + B4i/Files/Special/B4X_FontAwesome.otf | Bin 0 -> 134808 bytes B4i/Files/Special/B4X_MaterialIcons.ttf | Bin 0 -> 128180 bytes B4i/Files/login.bil | Bin 0 -> 4613 bytes B4i/Files/page2.bil | Bin 0 -> 4596 bytes B4i/Files/page3.bil | Bin 0 -> 4042 bytes ReplyAuto.lnk | Bin 0 -> 995 bytes gitpull.bat | 1 + 50 files changed, 5153 insertions(+) create mode 100644 .gitignore create mode 100644 B4A/B4AProject.b4a.meta create mode 100644 B4A/B4XImagenes.bas create mode 100644 B4A/B4XMainPage.bas create mode 100644 B4A/B4XPage2.bas create mode 100644 B4A/B4XPage3.bas create mode 100644 B4A/B4XPage4.bas create mode 100644 B4A/B4XReglas.bas create mode 100644 B4A/DBRequestManager.bas create mode 100644 B4A/DBRequestManagerV1.bas create mode 100644 B4A/DBRequestManagerV2.bas create mode 100644 B4A/Files/add.png create mode 100644 B4A/Files/add2.png create mode 100644 B4A/Files/chatbot6_191x191.png create mode 100644 B4A/Files/chatbot7_191x191.png create mode 100644 B4A/Files/contactitem.bal create mode 100644 B4A/Files/editaregla.bal create mode 100644 B4A/Files/errores.db create mode 100644 B4A/Files/floatbutton_layout.bal create mode 100644 B4A/Files/imagenes.bal create mode 100644 B4A/Files/imgitem.bal create mode 100644 B4A/Files/mainpage.bal create mode 100644 B4A/Files/page2.bal create mode 100644 B4A/Files/page3.bal create mode 100644 B4A/Files/reglas.bal create mode 100644 B4A/Files/reglas.db create mode 100644 B4A/Files/robot-icons_2_191x191.png create mode 100644 B4A/Files/robot3_191x191.png create mode 100644 B4A/Files/robot4_191x191.png create mode 100644 B4A/Files/robot8_191x191.png create mode 100644 B4A/Files/robot_192x192.png create mode 100644 B4A/Files/robotic_191x191.png create mode 100644 B4A/Files/ruleitem.bal create mode 100644 B4A/NotificationService.bas create mode 100644 B4A/ReplyAuto.b4a create mode 100644 B4A/ReplyAuto.b4a.meta create mode 100644 B4A/Starter.bas create mode 100644 B4A/Subs.bas create mode 100644 B4A/cvFloatingBtn.bas create mode 100644 B4A/reglas.bas create mode 100644 B4A/startWA.bas create mode 100644 B4i/B4iProject.b4i create mode 100644 B4i/B4iProject.b4i.meta create mode 100644 B4i/Files/Special/B4X_FontAwesome.otf create mode 100644 B4i/Files/Special/B4X_MaterialIcons.ttf create mode 100644 B4i/Files/login.bil create mode 100644 B4i/Files/page2.bil create mode 100644 B4i/Files/page3.bil create mode 100644 ReplyAuto.lnk create mode 100644 gitpull.bat diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af94e9d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +**/Objects +**/AutoBackups \ No newline at end of file diff --git a/B4A/B4AProject.b4a.meta b/B4A/B4AProject.b4a.meta new file mode 100644 index 0000000..adca1e9 --- /dev/null +++ b/B4A/B4AProject.b4a.meta @@ -0,0 +1,24 @@ +ModuleBookmarks0= +ModuleBookmarks1= +ModuleBookmarks2= +ModuleBookmarks3= +ModuleBookmarks4= +ModuleBookmarks5= +ModuleBookmarks6= +ModuleBreakpoints0= +ModuleBreakpoints1= +ModuleBreakpoints2= +ModuleBreakpoints3= +ModuleBreakpoints4= +ModuleBreakpoints5= +ModuleBreakpoints6= +ModuleClosedNodes0=2,6 +ModuleClosedNodes1= +ModuleClosedNodes2= +ModuleClosedNodes3= +ModuleClosedNodes4= +ModuleClosedNodes5= +ModuleClosedNodes6=1 +NavigationStack=B4XMainPage,b_test_Click,57,0,NotificationService,getGroupName,191,0,NotificationService,getNumberWA,178,0,NotificationService,getGroupName2,200,6,NotificationService,ReplyAuto_NotificationPosted,47,6,NotificationService,regexSimple,121,0,NotificationService,isGroupWA,136,0,NotificationService,isGroupWA2,140,6,NotificationService,isPersonWA,145,6,NotificationService,isPersonWA2,154,6,NotificationService,getPersonFromGroup,205,0 +SelectedBuild=0 +VisibleModules=1,5,2,3,4 diff --git a/B4A/B4XImagenes.bas b/B4A/B4XImagenes.bas new file mode 100644 index 0000000..2e94f30 --- /dev/null +++ b/B4A/B4XImagenes.bas @@ -0,0 +1,77 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.86 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Public cvs As B4XCanvas + Public Panel1 As B4XView + Private i_waImg As ImageView + Private l_imgData As Label + Private clv_imagenes As CustomListView +End Sub + +'You can add more parameters here. +Public Sub Initialize + +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("Imagenes") + cvs.Initialize(Panel1) + B4XPages.SetTitle(Me, "Imagenes disponibles") +End Sub + +Sub B4XPage_Appear + Private losDatos As List = Subs.traeImgMsjData + Private bmp As Bitmap + clv_imagenes.Clear + For i = 0 To losDatos.Size - 1 +' Log(losDatos.Get(i).As(Map)) +' Log(losDatos.Get(i).As(Map).Get("imgData").As(Map).Get("file_path")) + Private theDir As String = Starter.waDir & "/" & losDatos.Get(i).As(Map).Get("imgData").As(Map).Get("file_path") +' Log(theDir.SubString2(0, theDir.LastIndexOf("/")+1)) +' Log(theDir.SubString(theDir.LastIndexOf("/")+1)) + If theDir.EndsWith("jpg") Or theDir.EndsWith("png") Then + bmp = LoadBitmap(theDir.SubString2(0, theDir.LastIndexOf("/")+1), theDir.SubString(theDir.LastIndexOf("/")+1)) + clv_imagenes.Add(createImgItem(bmp, losDatos.Get(i).As(Map).Get("msjData").As(Map).Get("media_caption"), 386dip, 90dip), losDatos.Get(i)) + End If + Next +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Private Sub btnClear_Click + +End Sub + +Sub btnSet_Click + B4XPages.ClosePage(Me) +End Sub + +Sub createImgItem(img As Bitmap, text As String, Width As Int, Height As Int) As Panel + Dim p As B4XView = xui.CreatePanel("") +' Private pLeft = p_rules.left + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("imgItem") + i_waImg.Bitmap = img + l_imgData.Text = text + Return p +End Sub + +Private Sub clv_imagenes_ItemClick (Index As Int, Value As Object) + If Starter.Logger Then Log(Value) +End Sub + +Sub clv_imagenes_ItemLongClick (Index As Int, Value As Object) + B4XPages.MainPage.phv.Vibrate(100) + Subs.mandaWAImageRoot(Null, "Alo Papagena … Tore bella com la papaia", Value) + ToastMessageShow("Imagen mandada.",False) + If starter.Logger Then Log(Value) +End Sub \ No newline at end of file diff --git a/B4A/B4XMainPage.bas b/B4A/B4XMainPage.bas new file mode 100644 index 0000000..d0ce5f1 --- /dev/null +++ b/B4A/B4XMainPage.bas @@ -0,0 +1,410 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.85 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Public c_reglas As B4XReglas + Public c_imagenes As B4XImagenes + Public Page4 As B4XPage4 + Dim rp As RuntimePermissions + Dim phv As PhoneVibrate + Public manager As AdminManager + + Dim reqManager As DBRequestManager + Dim cmd As DBCommand + + Type lasNotis(numero As String, notif As StatusBarNotification) + +' Dim rp As ReplyAuto + Private et_mensaje As EditText + Private lv_notificaciones As ListView + Private EditText1 As EditText + Private b_activo As Button + Private b_p2 As Button + Private b_respaldaBD As Button + Private b_notifAccess As Button + Dim writePermission As Boolean + +' Dim Su As SuShell +' Dim Process As SuProcess +' Dim lt As List + Dim notiIcon As Bitmap + Dim OldIntent As Intent + Private b_imgWA As Button + Dim b_config As Button + Dim Timer1 As Timer + Dim interval As Int = 15 + Private p_notisDisponibles As Panel + Private b_NotisDisp As Button + Private p_botones As Panel + Private b_cierra As Button +End Sub + +'You can add more parameters here. +Public Sub Initialize + StartService(NotificationService) + If Not(NotificationService.notisMap2.IsInitialized) Then NotificationService.notisMap2.Initialize + #if not(DEBUG) + Starter.logger = False + #end if +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Timer1.Initialize("Timer1", interval * 1000) + Timer1.Enabled = True + notiIcon = LoadBitmapResize(File.DirAssets, "chatbot7_191x191.png", 24dip, 24dip, False) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("mainPage") + B4XPages.SetTitle(Me, "Bow 2.0") + c_reglas.Initialize + B4XPages.AddPage("Reglas", c_reglas) + c_imagenes.Initialize + B4XPages.AddPage("Imagenes", c_imagenes) + #end region + If Starter.logger Then B4XPages.GetManager.LogEvents = True + getWritePermission + getcontactsPermission +End Sub + +Sub b4xpage_appear + Dim in As Intent = B4XPages.GetNativeParent(Me).GetStartingIntent 'Traemos en StartingIntent de Main. + If in.IsInitialized And in <> OldIntent Then + OldIntent = in + If in.HasExtra("Notification_Tag") Then 'Revisamos que traiga el tag. + If Starter.logger Then Log("Activity started from notification. Tag: " & in.GetExtra("Notification_Tag")) + Private waChat, nombre As String + Private ts() As String = Regex.Split("\|", in.GetExtra("Notification_Tag")) + waChat = ts(0) + nombre = ts(1) + If Starter.logger Then LogColor($"ts=${ts}, ts.Length=${ts.Length}, waChat=${waChat}, nombre=${nombre}"$, Colors.green) + Starter.historicoDB.ExecNonQuery2("update historico set clic = '1' where clic = '0' and nombre = ?", Array As Object(nombre)) 'Ponemos en 1 las notificacion a las que ya se les dió clic. + CallSubDelayed2(Main, "Activity_KeyPress", KeyCodes.KEYCODE_BACK) + Subs.abreWAChat(waChat) + End If + End If + Subs.centraPanel(p_botones, Root.Width) + If NotificationService.notisMap2.IsInitialized Then llenaLV + If Not(CheckNotificationAccess) Then + Private cd1 As ColorDrawable + cd1.Initialize(Colors.red, 10dip) + b_notifAccess.Background = cd1 + b_notifAccess.TextColor = Colors.White + b_notifAccess.Text = "Activar Permisos" + Else + Private cd1 As ColorDrawable + cd1.Initialize(Colors.RGB(109, 221, 101), 10dip) + b_notifAccess.Background = cd1 + b_notifAccess.TextColor = Colors.White + b_notifAccess.Text = "Permisos Activos" + End If +' Dim Su As SuShell +' If Su.DeviceRooted Then +' If Starter.logger Then LogColor("Rooted", Colors.Green) +' Private suCmd As String = $"sqlite3 /data/data/com.whatsapp/databases/msgstore.db 'SELECT _id FROM messages WHERE data="Test 2"';"$ +'' Private suCmd As String = $"ls"$ +' If Su.ExecuteWithEvent(suCmd, "Su").WaitForCompletion Then +' If starter.Logger Then Log("Root - Done") +' Else +' If starter.Logger Then Log("Root - Permissions Error") +' End If +' Else +' If Starter.logger Then LogColor("Root - Device not rooted", Colors.red) +' End If + If Starter.logger Then LogColor("Cola de notificaciones="&NotificationService.notificacionesPorContestar, Colors.RGB(168,0,0)) + getAdminRights +End Sub + +Sub B4XPage_CloseRequest As ResumableSub + 'Return True to close, False to cancel + Return True +End Sub + +Sub Su_Start + If Starter.logger Then Log("Su: Start") +End Sub + +Sub Su_Command(Command As String, Response() As String) + If Starter.logger Then Log("Su: Command") + Dim Lines As String + For i=0 To Response.Length-1 + Lines = Lines & Response(i) & CRLF + Next +' Msgbox(Lines.Trim, Command) + If Starter.logger Then Log(Lines & CRLF) +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. +Sub b_notifAccess_Click + Dim In As Intent + In.Initialize("android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS", "") + StartActivity(In) +End Sub + +Sub b_notifAccess_LongClick + Subs.abreWAChat("5215554192439@s.whatsapp.net") +End Sub + +Private Sub b_activo_Click + If NotificationService.status = "Servicio Activo" Then + NotificationService.status = "Servicio Apagado" + Private cd1 As ColorDrawable + cd1.Initialize(Colors.red, 10dip) + b_activo.Background = cd1 + b_activo.Text = "Servicio Apagado" + NotificationService.cont = 101 + StopService(NotificationService) + Else + NotificationService.status = "Servicio Activo" + Private cd1 As ColorDrawable + cd1.Initialize(Colors.RGB(109, 221, 101), 10dip) + b_activo.Background = cd1 + b_activo.Text = "Servicio Activo" + NotificationService.cont = 101 + StartService(NotificationService) + End If +End Sub + +Private Sub b_test_Click + If starter.Logger Then Log("Test clicked") +' If NotificationService.notisMap2.IsInitialized Then EditText1.Text = NotificationService.notisMap2.As(JSON).ToString +' Subs.mandaWAMsjSBN("+52 55 1661 1480", $"Prueba - ${DateTime.Time(DateTime.now)}"$) +' If Starter.logger Then LogColor($"starterStatus=${Starter.starterStatus}, nsStatus=${NotificationService.nsStatus}"$, Colors.Blue) +' CallSubDelayed(NotificationService, "procesaColaDeNotificaciones") +' Private jid As String = "5215516611480" +' Subs.mandaWAMsjRoot("1.- Hola", jid) + reqManager.Initialize(Me, Starter.DBRServer) + cmd.Initialize + cmd.Name = "select_revisaBorrarVenta" 'Intentamos conectarnos al servido publico y si no responde cambiamos al interno. + cmd.Parameters = Array As Object("525554192439","16","4","16","4","16","4","16","4","16","4","525554192439") + reqManager.ExecuteQuery(cmd , 0, "revisaVenta", 750) 'request con timeout corto en ms. + +' cmd.Name = "proc_recuperaClientesNuevos" +' cmd.Parameters = Array As Object("35","634","CHATBOT") +' reqManager.ExecuteCommand(cmd ,"procRecuperaClientes") +End Sub + +Private Sub b_test_LongClick +' desbloqueaUsuario("CDAZA") + Private cont As Int = 0 + For j = 1 To 4 + For i = cont To cont+5 + cont = cont + 1 + If Starter.logger Then LogColor("cont="&cont, Colors.Blue) + If Starter.logger Then LogColor("Mandamos mensaje " & cont, Colors.Magenta) + Subs.mandaWAMsjRoot(cont & ".- Hola", "5215516611480") +' Subs.hazRootQuery("killall com.whatsapp", "KillWA") + Next + If Starter.logger Then LogColor("Iniciamos WA", Colors.Blue) + Subs.hazRootQuery("am start -n com.whatsapp/com.whatsapp.Main", "iniciaWA") + +' Try +' Dim Intent1 As Intent +' Dim pm As PackageManager +' Intent1 = pm.GetApplicationIntent("com.whatsapp") +' StartActivity (Intent1) +' Catch +' Log ("Failed to launch app! Is it installed?") +' End Try + + If Starter.logger Then LogColor("Esperamos 5 segs", Colors.red) + Sleep(5000) + Next + cont = 0 + If Starter.logger Then Log("TERMINAMOS") +' Subs.copyWADB +' Subs.mandaWAImageRoot_0(1) +' Subs.traeImgMsjData +End Sub + +Sub llenaLV +' Log("llenaLV") +' lv_notificaciones.Initialize("lv_notificaciones") + lv_notificaciones.Color = Colors.LightGray + lv_notificaciones.Clear + Dim label1 As Label + label1 = lv_notificaciones.SingleLineLayout.Label + label1.TextSize = 16 + label1.TextColor = Colors.Black + lv_notificaciones.SingleLineLayout.ItemHeight = 110 'Alto de la opcion de la lista. + label1.Height = 40dip 'Alto de la etiqueta dentro de la opcion de la lista. +' Log(NotificationService.notisMap2.Keys) + For Each k As String In NotificationService.notisMap2.Keys + lv_notificaciones.AddSingleLine(k) + Next +End Sub + +Sub lv_notificaciones_ItemClick (Position As Int, Value As Object) +' Log($"posicion: ${Position}, valor: ${Value}, sender: ${Sender}"$) + Private t0 As Map = NotificationService.notisMap2.Get(Value) + Dim t1 As StatusBarNotification = t0.Get(Value).As(lasNotis).notif +' Dim t2 As StatusBarNotification = t1.notif + Subs.abreWAChat(Subs.getShortcut(t1)) +End Sub + +Private Sub lv_notificaciones_ItemLongClick (Position As Int, Value As Object) + If Starter.logger Then Log($"posicion: ${Position}, valor: ${Value}, sender: ${Sender}"$) + Private tempMap As Map = NotificationService.notisMap2.Get(Value) 'Valeria Guerra Rivera + Private t1 As lasNotis = tempMap.Get(Value) + Private t2 As StatusBarNotification = t1.notif +' Log(t2) + If et_mensaje.Text = "" Then ToastMessageShow("El texto del mensaje no debe estar en blanco.", False) + If t2.IsInitialized And et_mensaje.Text <> "" Then + NotificationService.rp.reply(t2.Notification, t2.PackageName, et_mensaje.text) +' CallSubDelayed3(NotificationService, "guardaMsjSalida", t2, et_mensaje.text) + ToastMessageShow("Mensaje enviado!", False) + End If +End Sub + +Private Sub b_p2_Click + B4XPages.ShowPage("Reglas") +End Sub + +Private Sub b_respaldaBD_Click + Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE) + Wait For Activity_PermissionResult (Permission As String, Result As Boolean) + If Result Then + Subs.copiaDB + Else + ToastMessageShow("Sin permisos", False) + End If +End Sub + +Sub b_respaldaBD_LongClick + Try + File.Copy(File.DirRootExternal&"/Bow2.0","bow.db",File.DirInternal,"bow.db") + ToastMessageShow("Listo, reglas restauradas " & File.DirRootExternal&"/Bow2.0", False) + If Starter.logger Then Log("Listo, reglas restauradas " & File.DirRootExternal&"/Bow2.0") + Subs.traeReglas + Starter.reglasDB.Initialize(Starter.ruta, "bow.db", True) + B4XPages.MainPage.c_reglas.muestraReglas + Catch + ToastMessageShow("No se pudo hacer la copia: "&LastException, True) + End Try +End Sub + +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 getcontactsPermission + If Starter.logger Then Log("getcontactsPermission") + rp.CheckAndRequest(rp.PERMISSION_READ_CONTACTS) + Wait For Activity_PermissionResult (Permission As String, Result As Boolean) + Dim p2 As B4XReglas = B4XPages.GetManager.GetPage("Reglas") + If Result Then + p2.contactsPermission = True + If Starter.logger Then Log(p2.contactsPermission) + Else + p2.contactsPermission = False + If Starter.logger Then Log(p2.contactsPermission) + ToastMessageShow("Sin permisos de contactos", False) + End If +End Sub + +Sub getWritePermission + If Starter.logger Then Log("getcontactsPermission") + rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE) + Wait For Activity_PermissionResult (Permission As String, Result As Boolean) + If Result Then + writePermission = True + If Starter.logger Then Log(writePermission) + Else + writePermission = False + If Starter.logger Then Log(writePermission) + ToastMessageShow("Sin permisos de escritura", False) + End If +End Sub + +Private Sub b_imgWA_Click + B4XPages.ShowPage("Imagenes") +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 + +Private Sub b_config_Click + Private cd1 As ColorDrawable + cd1.Initialize(Colors.Gray, 10dip) + B4XPages.MainPage.b_config.Background = cd1 + NotificationService.pruebaPaso = 0 + CallSubDelayed(NotificationService, "revisaConexion") +End Sub + +Private Sub Timer1_Tick +' ToastMessageShow("Timer",False) +' ENVIA_ULTIMA_GPS 'Comentado para que no estorbe hasta que no esten los queries correctos en el config.properties + NotificationService.pruebaPaso = 0 + CallSubDelayed(NotificationService, "revisaConexion") +End Sub + +Private Sub Panel1_Click + If p_notisDisponibles.Visible Then p_notisDisponibles.Visible = False +End Sub + +Private Sub p_notisDisponibles_Click + +End Sub + +Private Sub b_NotisDisp_Click + p_notisDisponibles.Width = Root.Width * 0.9 + Subs.centraPanel(p_notisDisponibles, Root.Width) + p_notisDisponibles.Top = (Root.Height/2) - (p_notisDisponibles.Height/2) + lv_notificaciones.Width = p_notisDisponibles.Width * 0.9 + lv_notificaciones.Left = (p_notisDisponibles.Width/2) - (lv_notificaciones.Width/2) + b_cierra.Left = p_notisDisponibles.Width - (b_cierra.Width + 10) + et_mensaje.Width = p_notisDisponibles.Width * 0.8 + p_notisDisponibles.BringToFront + p_botones.SendToBack + p_notisDisponibles.Visible = True +End Sub + +Private Sub b_cierra_Click + p_notisDisponibles.Visible = False +End Sub + +Sub JobDone(Job As HttpJob) 'ignore + If Starter.logger Then LogColor("jobDone: " & Job.Tag, Colors.Magenta) + If Job.Success = False Then + If Starter.Logger Then LogColor("***** jobDone Error *****", Colors.Red) + If Starter.Logger Then LogColor(Job.ErrorMessage, Colors.Red) + Else + If Starter.Logger Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then 'Para desbloquear un usuario Guna. + Dim result As DBResult = reqManager.HandleJob(Job) + If Starter.Logger Then Log("******************************************************") + If Starter.Logger Then Log($"************ ${result.Tag} ***********"$) + If Starter.Logger Then Log("******************************************************") + + If result.Tag=="revisaVenta" Then 'query tag + Private num As String = result.Tag + num = num.SubString(num.IndexOf("_")+1) + If Starter.logger Then Log(num) + For Each records() As Object In result.Rows + For Each k As String In result.Columns.Keys + If Starter.logger Then LogColor(result.Tag & ": " & k & "=" & records(result.Columns.Get(k)), Colors.blue) + Next +' Dim autorizado As String = records(result.Columns.Get("AUTORIZADO")) +' Dim existe_venta As String = records(result.Columns.Get("EXISTE_VENTA")) +' Dim impresa As String = records(result.Columns.Get("IMPRESA")) +' Dim comercial As String = records(result.Columns.Get("COMERCIAL")) +' Dim condescuento As String = records(result.Columns.Get("CONDESCUENTO")) + Next + End If + End If + Job.Release + End If +End Sub \ No newline at end of file diff --git a/B4A/B4XPage2.bas b/B4A/B4XPage2.bas new file mode 100644 index 0000000..d0590b3 --- /dev/null +++ b/B4A/B4XPage2.bas @@ -0,0 +1,598 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.86 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Dim ime As IME 'ignore +' Private lblHello As B4XView + Private ImageView1 As B4XView 'ignore +' Private Page3 As B4XPage3 + Private CustomListView1 As CustomListView 'ignore +' Private Tree As CLVTree +' Private b_colapsa As Button +' Private b_expande As Button +' Private Panel2 As Panel + Private clv_reglas2 As CustomListView + Private et_regla As EditText + Private p_rules As Panel + Private l_tit As Label +' Private l_rule As Label + Private p_reglas As Panel + Private l_tit2 As Label + Private et_regla2 As EditText + Private cb_activa As CheckBox + Private l_regla As Label + Private p_editarRegla As Panel + Private et_nombre As EditText + Private b_cancelar As Button + Private et_entra As EditText + Private et_sale As EditText + Private l_sale As Label + Private l_regla_1 As Label + Private l_regla_2 As Label + Private p_separador As Panel + Private r_destinatario_p As RadioButton + Private r_destinatario_g As RadioButton + Private r_destinatario_a As RadioButton + Dim destinatario As String = "Personas" + Private l_flecha As Label + Private fb_add As cvFloatingBtn + Private p_msgBox As Panel + Private l_msgBoxTitle As Label + Private l_msgBoxText As Label + Private b_msgBoxYes As Button + Private b_msgBoxNo As Button + Private p_sombra As Panel + Private p_contestacion As Panel + Private l_sale2 As Label + Private et_sale2 As EditText + Private p_recibimos As Panel + Private l_entra As Label + Private p_contactosEspecificos As Panel + Private et_contEsp As EditText + Private l_contEsp As Label + Dim contactsPermission As Boolean = False + Private clv_contactPicker As CustomListView + Private PCLV As PreoptimizedCLV + Private l_contact As Label + Private cb_selectContact As CheckBox + Private p_contacts As Panel + Private p_contactPicker As Panel + Dim contactosEspecificos As List + Private p_conEsp As Panel + Private b_guardaConEsp As Button + Private et_conEsp As EditText + Private et_conEsp2 As EditText + Private b_getContacts As Button + Dim listaReglasContestaciones As List + Private b_addET As Button + Private ScrollView1 As ScrollView +End Sub + +'You can add more parameters here. +Public Sub Initialize + +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("Page2") +' Root.LoadLayout("floatbutton_layout") + B4XPages.SetTitle(Me, "Reglas") +' Page3 = B4XPages.GetPage("Page 3") + contactosEspecificos.Initialize + PCLV.Initialize(Me, "PCLV", clv_contactPicker) + PCLV_AddItems + muestraReglas +End Sub + +Private Sub B4XPage_Appear +' NotificationService.mapReglas = Subs.traeReglas +' clv_reglas2.Clear +' clv_reglas2.PressedColor = Colors.Transparent +' For Each m As Map In NotificationService.mapReglas.Values +' clv_reglas2.Add(CreateListItem(m.get("id"), m.get("nombre"), "Recibimos:", m.Get("recibe"), "Contestamos:", m.Get("contesta"), m.Get("activa"), 386dip, 90dip), m.get("id")) +' Next +' p_editarRegla.Visible = False +' p_sombra.Visible = False +' p_reglas.Width = Root.Width - 20 +' Subs.centraPanel(p_editarRegla, Root.Width) +End Sub + +Sub clv_contactPicker_VisibleRangeChanged (FirstIndex As Int, LastIndex As Int) + For Each i As Int In PCLV.VisibleRangeChanged(FirstIndex, LastIndex) + Dim item As CLVItem = clv_contactPicker.GetRawListItem(i) + Dim pnl As B4XView = xui.CreatePanel("") + pnl.Color = Colors.White + item.Color = Colors.White + item.Panel.AddView(pnl, 0, 0, item.Panel.Width, item.Panel.Height) + 'Create the item layout + pnl.LoadLayout("contactItem") + cb_selectContact.Tag = item.Value + l_contact.Text = item.Value + Next +End Sub + +Sub PCLV_AddItems + For Each contact As String In Subs.getContactos + PCLV.AddItem(40dip, xui.Color_White, contact) + Next + PCLV.Commit +End Sub + +'Return the hint that will be displayed when the user fast scrolls the list. It can be a string or CSBuilder. +Sub PCLV_HintRequested (Index As Int) As Object + Dim word As String = clv_contactPicker.GetValue(Index) + Return word +End Sub + +Sub muestraReglas + NotificationService.mapReglas = Subs.traeReglas +' Log("mapReglas=" & NotificationService.mapReglas) + clv_reglas2.Clear + clv_reglas2.PressedColor = Colors.Transparent +' clv_reglas2.AsView.Color = Colors.red + For Each m As Map In NotificationService.mapReglas.Values + clv_reglas2.Add(CreateListItem(m.get("id"), m.get("nombre"), "Recibimos:", m.Get("recibe"), "Contestamos:", m.Get("contesta"), m.Get("activa"), 386dip, 90dip), m.get("id")) + Next + p_editarRegla.Visible = False + p_sombra.Visible = False + p_reglas.Width = Root.Width - 20 + p_sombra.Width = Root.Width + p_sombra.Height = Root.Height + Subs.centraPanel(p_editarRegla, Root.Width) + Subs.centraPanel(p_sombra, Root.Width) +End Sub + +Sub CreateListItem(id As Int, nom As String, tit As String, rule As String, tit2 As String, rule2 As String, activa As Int, Width As Int, Height As Int) As Panel + Dim p As B4XView = xui.CreatePanel("") + Dim active As Boolean = False +' Private pLeft = p_rules.left + If activa = 1 Then active = True + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("ruleItem") + l_tit.Text = tit + l_regla_1.Text = rule + l_tit2.Text = tit2 + l_regla_2.Text = rule2 + Subs.SetButtonTintList(cb_activa, Colors.red, Colors.RGB(7, 183, 0)) + If nom.IndexOf(".") > -1 Then + Private cuantos As Int = Subs.CountChars(nom, ".") +' Log(cuantos) + Private leftOffs As Int = 15 + If cuantos > 0 Then leftOffs = leftOffs * cuantos + p_rules.Left = p_rules.Left + leftOffs + p_rules.Width = p_rules.Width - leftOffs + l_regla_1.Width = l_regla_1.Width - leftOffs + l_regla_2.Width = l_regla_2.Width - leftOffs + cb_activa.Left = cb_activa.Left - leftOffs + Dim cd1 As ColorDrawable + cd1.Initialize2(Colors.White, 30, 5, Colors.Red) + l_regla.TextColor = Colors.red +' l_flecha.TextColor = Colors.red +' p_rules.Color = Colors.RGB(209, 0, 0) + p_rules.Background = cd1 + + If cuantos > 0 Then + l_flecha.Visible = True + l_regla.Left = l_regla.Left + 40 +' If cuantos = 2 Then p_rules.Color = Colors.RGB(134, 246, 126) +' If cuantos > 2 Then p_rules.Color = Colors.RGB(217, 217, 217) + If cuantos = 2 Then + cd1.Initialize2(Colors.White, 30, 5, Colors.Gray) + l_regla.TextColor = Colors.Gray +' l_flecha.TextColor = Colors.Gray + End If + If cuantos = 3 Then + cd1.Initialize2(Colors.White, 30, 6, Colors.RGB(255, 140, 125)) + l_regla.TextColor = Colors.RGB(255, 140, 125) +' l_flecha.TextColor = Colors.RGB(255, 140, 125) + End If + If cuantos > 3 Then + cd1.Initialize2(Colors.White, 30, 6, Colors.RGB(250, 161, 38)) + l_regla.TextColor = Colors.RGB(250, 161, 38) +' l_regla.TextColor = Colors.RGB(250, 161, 38) + End If + p_rules.Background = cd1 + End If + End If + + Dim su As StringUtils + ' recalculate new heights +' Dim prhTemp As Int = p_rules.Height + l_regla_1.height = su.MeasureMultilineTextHeight(l_regla_1, l_regla_1.Text) + l_regla_2.height = su.MeasureMultilineTextHeight(l_regla_2, l_regla_2.Text) + p_separador.Top = l_regla_1.Top + l_regla_1.Height + 10 + l_tit2.Top = p_separador.Top + 20 + l_regla_2.Top = l_tit2.top + p_rules.Height = l_regla_1.Height + l_regla_2.Height + 110 + p.SetLayoutAnimated(0, 0, 0, Width, p_rules.Height +10) + + cb_activa.Checked = active + cb_activa.Tag = id + l_regla.Text = nom + l_regla.Tag = id + Return p +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. +Sub b_1_Click +' B4XPages.ShowPage("Page 3") +End Sub + +Sub btnSignOut_Click +' Page3.ClearImage +' UpdateImage +' B4XPages.ShowPageAndRemovePreviousPages("MainPage") +End Sub + +Private Sub cb_activa_CheckedChange(Checked As Boolean) + Dim chk As CheckBox = Sender +' if starter.showLogs then Log(Checked & " | " & chk.tag ) + If chk.Tag <> Null And chk.Tag <> "" Then + Dim p_regla As Panel = Sender.As(View).Parent.As(Panel) +' if starter.showLogs then Log("|"&p_regla.NumberOfViews) + Private idRegla As Int = chk.tag + Private activa As Boolean = Checked +' Private recibimos As String = p_regla.GetView(1).as(Label).text +' Private mandamos As String = p_regla.GetView(3).as(Label).text + If Starter.showLogs Then Log("|"&p_regla.GetView(5)) + Subs.guardaRegla(idRegla, activa) + NotificationService.mapReglas = Subs.traeReglas + End If +' Log(NotificationService.mapReglas) +End Sub + +'Borramos la regla. +Sub cb_activa_LongClick + Private chk As CheckBox = Sender + If Starter.showLogs Then Log(chk.tag) + p_msgBox.Top = (Root.Height/2) - (p_msgBox.Height/2) + Subs.centraPanel(p_msgBox, Root.Width) + l_msgBoxTitle.Text = "Borrar regla" + l_msgBoxText.text = $"¿Seguro que desea borrar la regla ${chk.tag}?"$ + p_msgBox.Visible = True + b_msgBoxYes.Tag = chk.tag + p_msgBox.Tag = clv_reglas2.GetItemFromView(Sender.As(View)) + If Starter.showLogs Then LogColor(p_msgBox.tag, Colors.Magenta) +' if starter.showLogs then LogColor(clv_reglas2.Size,Colors.Magenta) +End Sub + +Private Sub b_msgBoxYes_Click + p_msgBox.Visible = False + If Starter.showLogs Then Log(Sender.As(Button).tag) + Subs.borrarRegla(Sender.As(Button).tag) + NotificationService.mapReglas = Subs.traeReglas +' B4XPage_Appear + clv_reglas2.RemoveAt(p_msgBox.Tag) +' muestraReglas +End Sub + +Private Sub b_msgBoxNo_Click + p_msgBox.Visible = False +End Sub + +Sub p_msgBox_Click + 'Do nothing +End Sub + +Private Sub et_regla_TextChanged (Old As String, New As String) + Dim p_regla As Panel = Sender.As(View).Parent.As(Panel) + Private cb As CheckBox = p_regla.GetView(2) + cb.Checked = False +' Log(cb.checked) +End Sub + +Private Sub et_regla2_TextChanged (Old As String, New As String) + Dim p_regla As Panel = Sender.As(View).Parent.As(Panel) + Private cb As CheckBox = p_regla.GetView(2) + cb.Checked = False +' Log(cb.checked) +End Sub + +Private Sub L_regla_LongClick +' et_nombre.Text = Sender.As(Label).text +' et_nombre.Tag = Sender.As(Label).tag +' Log(Sender.As(Label)) +'' Log(Sender.As(Label).Tag & "|"&NotificationService.mapReglas) +' Private d As Map = NotificationService.mapReglas.Get(Sender.As(Label).tag) +'' Log(d) +' et_entra.Text = d.Get("recibe") +' et_sale.Text = d.Get("contesta") +' p_editarRegla.visible = True +' RecalculateHeightViews +End Sub + +Private Sub b_guardar_Click + For i = 0 To listaReglasContestaciones.Size -1 + et_sale.Text = et_sale.Text & "//" & listaReglasContestaciones.Get(i).As(EditText).text + Next + if starter.showLogs then Log(et_sale.text) + Subs.actualizaRegla(et_nombre.Tag, et_nombre.text, et_entra.Text, et_sale.text, r_destinatario_p.tag, et_contEsp.text) +' NotificationService.mapReglas = Subs.traeReglas + muestraReglas + p_editarRegla.Visible = False + p_sombra.Visible = False + ime.HideKeyboard +End Sub + +Private Sub b_cancelar_Click + p_editarRegla.Visible = False + p_editarRegla.SendToBack +' ScrollView1.Visible = False + p_sombra.Visible = False + ime.HideKeyboard +End Sub + +Sub RecalculateHeightViews +' Log("Recalcula") + Dim su As StringUtils + 'Recalculate new heights + et_entra.height = su.MeasureMultilineTextHeight(et_entra, et_entra.Text) + 60 + et_sale.height = su.MeasureMultilineTextHeight(et_sale, et_sale.Text)+ 60 + et_contEsp.Height = su.MeasureMultilineTextHeight(et_contEsp, et_contEsp.Text)+ 60 + p_recibimos.Height = et_entra.Height + 20 + p_contestacion.Height = et_sale.Height + 20 + p_contactosEspecificos.Height = et_contEsp.Height + 20 + ' Recalculate new vertical positions + p_recibimos.Top =l_entra.Top + l_entra.Height + 5 + l_sale.Top = p_recibimos.Top + p_recibimos.height + 5 + p_contestacion.Top = l_sale.Top + l_sale.height + 5 + If listaReglasContestaciones.Size > 0 Then + For j = 0 To listaReglasContestaciones.Size - 1 + listaReglasContestaciones.Get(j).As(EditText).Height = su.MeasureMultilineTextHeight(listaReglasContestaciones.Get(j).As(EditText), listaReglasContestaciones.Get(j).As(EditText).Text) + 60 + p_contestacion.Height = p_contestacion.Height + listaReglasContestaciones.Get(j).As(EditText).Height - 15 + Next + End If + ScrollView1.Panel.Height = p_recibimos.Height + p_contestacion.Height + p_contactosEspecificos.Height + 500 + For n = 0 To listaReglasContestaciones.Size - 1 + If n = 0 Then + listaReglasContestaciones.Get(n).As(EditText).Top = et_sale.Top + et_sale.Height - 15 + Else if n > 0 Then + listaReglasContestaciones.Get(n).As(EditText).Top = listaReglasContestaciones.Get(n-1).As(EditText).Top + listaReglasContestaciones.Get(n-1).As(EditText).Height - 15 + End If +' LogColor(listaReglasContestaciones.Get(n).As(EditText).Top, Colors.red) + Next + r_destinatario_p.Top = p_contestacion.Top + p_contestacion.Height + r_destinatario_g.Top = r_destinatario_p.top + r_destinatario_a.Top = r_destinatario_p.top + l_contEsp.Top = r_destinatario_p.Top + r_destinatario_p.Height + b_addET.Top = l_sale.top - 1 + b_getContacts.Top = l_contEsp.top - 5 + p_contactosEspecificos.Top = l_contEsp.Top + l_contEsp.Height +End Sub + +Private Sub et_entra_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub et_sale_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub et_sale2_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub et_contEsp_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub clv_reglas2_ItemClick (Index As Int, Value As Object) + If Starter.showLogs Then Log(Index &"|" & Value) + listaReglasContestaciones.Initialize +' p_editarRegla.Visible = True +' p_editarRegla.BringToFront + ScrollView1.Panel.RemoveAllViews + ScrollView1.Panel.LoadLayout("editaRegla") + ScrollView1.Height = p_editarRegla.Height * 0.9 + ScrollView1.Panel.Height = ScrollView1.Height + Private et_sale As EditText + et_sale.Initialize("et_sale") + et_sale.TextColor = Colors.Black + et_sale.TextSize = 12 + p_contestacion.RemoveAllViews + p_contestacion.AddView(et_sale, 10, 10, (p_contestacion.Width*0.95), 30dip) + Private d As Map = NotificationService.mapReglas.Get(Value) + If Starter.showLogs Then Log(d) + et_entra.InputType = Bit.Or(0x00080000, 0x00000090) 'TYPE_TEXT_FLAG_NO_SUGGESTIONS | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + et_entra.SingleLine = False + et_sale.InputType = Bit.Or(0x00080000, 0x00000090) 'TYPE_TEXT_FLAG_NO_SUGGESTIONS | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + et_sale.SingleLine = False + et_contEsp.InputType = Bit.Or(0x00080000, 0x00000090) 'TYPE_TEXT_FLAG_NO_SUGGESTIONS | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + et_contEsp.SingleLine = False + et_nombre.Tag = Value + et_nombre.Text = d.Get("nombre") + et_entra.Text = d.Get("recibe") + Private ets() As String = Regex.Split("//", d.Get("contesta")) 'Dividimos el regla en sus multiples respuestas. +' et_sale.Text = d.Get("contesta") + et_sale.Text = ets(0).trim + If ets.Length > 1 Then + For x = 1 To ets.Length - 1 + addET(ets(x).Trim) + Next + End If + destinatario = "Personas" + If d.Get("destinatario") <> Null Then destinatario = d.Get("destinatario") + If destinatario = "Personas" Then r_destinatario_p.Checked = True + If destinatario = "Grupos" Then r_destinatario_g.Checked = True + If destinatario = "Ambos" Then r_destinatario_a.Checked = True + et_contEsp.Text = d.Get("contactoEspecifico") + r_destinatario_p.Tag = destinatario + p_editarRegla.visible = True + p_sombra.Visible = True + If Starter.showLogs Then Log(contactsPermission) +' If contactsPermission Then +' Dim res As List = InputMultiList(Subs.getContactos, "Select") +' Log(res) +' End If + RecalculateHeightViews +End Sub + +Private Sub r_destinatario_p_CheckedChange(Checked As Boolean) + If Starter.showLogs Then Log(Sender.As(RadioButton).text & "|" &Checked) + destinatario = Sender.As(RadioButton).text + r_destinatario_p.Tag = destinatario +End Sub + +Private Sub r_destinatario_g_CheckedChange(Checked As Boolean) + If Starter.showLogs Then Log(Sender.As(RadioButton).text & "|" &Checked) + destinatario = Sender.As(RadioButton).text + r_destinatario_p.Tag = destinatario +End Sub + +Private Sub r_destinatario_a_CheckedChange(Checked As Boolean) +' Log(Sender.As(RadioButton).text & "|" &Checked) + destinatario = Sender.As(RadioButton).text + r_destinatario_p.Tag = destinatario +End Sub + +'Agregamos regla. +Sub fb_add_Clicked(X As Float,Y As Float) +' ToastMessageShow("Button Clicked",False) + Subs.agregaRegla + NotificationService.mapReglas = Subs.traeReglas +' B4XPage_Appear + muestraReglas +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + Sleep(0) + If Starter.showLogs Then Log("B4XPage_CloseRequest") +' if starter.showLogs then Log(p_contactPicker.Visible) + If p_contactPicker.Visible = True Then + p_contactPicker.Visible = False + Return False + End If + If p_editarRegla.Visible Then + p_editarRegla.Visible = False + p_sombra.Visible = False + Return False + End If + Return True +End Sub + +Private Sub p_editarRegla_Click + 'Nothing here. +End Sub + +Private Sub p_sombra_Click + 'Nothing here. +End Sub + +Sub muestraContactos + If Starter.showLogs Then Log("muestraContactos") + p_contactPicker.Visible = True + ime.HideKeyboard + p_contactPicker.left = 0 + p_contactPicker.Top = 0 + p_contactPicker.Width = Root.Width + p_contactPicker.Height = Root.Height + clv_contactPicker.GetBase.SetLayoutAnimated(0, 5dip, 30dip, Root.Width - 10, Root.Height * 0.68) 'Cambiamos el tamaño y posición de la lista de productos + clv_contactPicker.Base_Resize(clv_contactPicker.GetBase.Width, clv_contactPicker.GetBase.Height) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. + p_conEsp.Top = clv_contactPicker.GetBase.Top + clv_contactPicker.GetBase.Height + 20 + b_guardaConEsp.top = p_conEsp.Top + p_conEsp.Height + 20 +End Sub + +Sub CreateContactsItem(nom As String, Width As Int, Height As Int) As Panel 'ignore + Dim p As B4XView = xui.CreatePanel("") + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("contactItem") + l_contact.Text = nom + p_contacts.Height = Height +' Log($"${p_contacts.Height}, ${l_contact.Height}"$) + cb_selectContact.Top = (p_contacts.Height/2) - (cb_selectContact.Height/2) + l_contact.Top = (p_contacts.Height/2) - (l_contact.Height/2) + Subs.SetButtonTintList(cb_selectContact, Colors.red, Colors.RGB(7, 183, 0)) + cb_selectContact.Tag = nom + l_contact.Text = nom + Return p +End Sub + +Private Sub clv_contactPicker_ItemClick (Index As Int, Value As Object) +' Log($"${Index}, ${Value}"$ ) + Dim cb As CheckBox = clv_contactPicker.GetPanel(Index).GetView(0).GetView(0) + If cb.Checked Then cb.Checked = False Else cb.Checked = True +End Sub + +Private Sub et_contEsp_FocusChanged (HasFocus As Boolean) +' If HasFocus Then +' muestraContactos +' End If +End Sub + +Private Sub cb_selectContact_CheckedChange(Checked As Boolean) + if starter.showLogs then Log(Sender.As(CheckBox).tag) + et_conEsp2.Text = "" + If Checked Then + contactosEspecificos.Add(Sender.As(CheckBox).tag) 'Si no está en la lista, lo agregamos. + Else + If contactosEspecificos.IndexOf(Sender.As(CheckBox).tag) > -1 Then + contactosEspecificos.RemoveAt(contactosEspecificos.IndexOf(Sender.As(CheckBox).tag)) 'Si ya esta en la lista lo quitamos. + End If + End If +' if starter.showLogs then Log(contactosEspecificos) + For Each c In contactosEspecificos + If et_conEsp2.Text <> "" Then et_conEsp2.Text = et_conEsp2.Text & ", " & c Else et_conEsp2.Text = c + Next +End Sub + +Private Sub b_guardaConEsp_Click + Dim l As List + l.initialize + Dim t() As String = Regex.Split(",", et_contEsp.text) + For i = 0 To t.Length-1 + l.add(t(i).trim) + Next + contactosEspecificos.AddAll(l) + contactosEspecificos = Subs.removeListDuplicates(contactosEspecificos) + et_contEsp.Text = "" + For Each c In contactosEspecificos + If et_contEsp.Text <> "" Then et_contEsp.Text = et_contEsp.Text & ", " & c Else et_contEsp.Text = c + Next + et_contEsp.text = et_contEsp.text.Replace(", ,", ",") + p_contactPicker.Visible = False + et_conEsp2.Text = "" + contactosEspecificos.Clear + clv_contactPicker.Clear + PCLV_AddItems +End Sub + +Private Sub b_getContacts_Click + muestraContactos +End Sub + +Sub addET(texto As String) + Dim etX As EditText + etX.Initialize("etX") + etX.TextColor = Colors.Black + etX.TextSize = 12 + etX.Tag = listaReglasContestaciones.size + listaReglasContestaciones.add(etX) + Dim newTop As Int = et_sale.top + et_sale.Height + If listaReglasContestaciones.Size > 0 Then + For k = 0 To listaReglasContestaciones.Size - 1 + newTop = newTop + listaReglasContestaciones.Get(k).As(EditText).Height + Next + End If + p_contestacion.AddView(etX, et_sale.left, newTop, et_sale.Width, 35dip) + etX.Text = texto +End Sub + +Private Sub b_addET_Click + addET("") +' Log("Agregamos ET, " & listaReglasContestaciones.size & "|" & etX.Tag & ", top=" & newTop) + RecalculateHeightViews +' Log(etX.top) +End Sub + +Sub etX_TextChanged (Old As String, New As String) +' Log(Sender.As(EditText).tag) + RecalculateHeightViews +End Sub \ No newline at end of file diff --git a/B4A/B4XPage3.bas b/B4A/B4XPage3.bas new file mode 100644 index 0000000..2d647fa --- /dev/null +++ b/B4A/B4XPage3.bas @@ -0,0 +1,77 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.86 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Public cvs As B4XCanvas + Public Panel1 As B4XView +End Sub + +'You can add more parameters here. +Public Sub Initialize + +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("Page3") + cvs.Initialize(Panel1) + B4XPages.SetTitle(Me, "Draw Something") + #if B4A + B4XPages.AddMenuItem(Me, "Random Background") + #End If +End Sub + + + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. + +Sub Panel1_Touch (Action As Int, X As Float, Y As Float) + If Action <> Panel1.TOUCH_ACTION_MOVE_NOTOUCH Then + cvs.DrawCircle(X, Y, 10dip, Rnd(xui.Color_Black, xui.Color_White), True, 0) + cvs.Invalidate + End If +End Sub + +Private Sub btnClear_Click + ClearImage +End Sub + +Public Sub ClearImage + If Panel1.IsInitialized Then + cvs.ClearRect(cvs.TargetRect) + cvs.Invalidate + End If +End Sub + +Sub btnSet_Click + B4XPages.ClosePage(Me) +End Sub + +Sub B4XPage_Resize (Width As Int, Height As Int) + ClearImage + cvs.Resize(Width, Height) +End Sub + +Sub B4XPage_MenuClick (Tag As String) + If Tag = "Random Background" Then + cvs.DrawRect(cvs.TargetRect, Rnd(xui.Color_Black, xui.Color_White), True, 0) + cvs.Invalidate + End If +End Sub + +#if B4J +'Delegate the native menu action to B4XPage_MenuClick. +Sub MenuBar1_Action + Dim mi As MenuItem = Sender + Dim t As String + If mi.Tag = Null Then t = mi.Text.Replace("_", "") Else t = mi.Tag + B4XPage_MenuClick(t) +End Sub +#End If \ No newline at end of file diff --git a/B4A/B4XPage4.bas b/B4A/B4XPage4.bas new file mode 100644 index 0000000..9525b97 --- /dev/null +++ b/B4A/B4XPage4.bas @@ -0,0 +1,24 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=11.45 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore +End Sub + +'You can add more parameters here. +Public Sub Initialize As Object + Return Me +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. \ No newline at end of file diff --git a/B4A/B4XReglas.bas b/B4A/B4XReglas.bas new file mode 100644 index 0000000..af0454f --- /dev/null +++ b/B4A/B4XReglas.bas @@ -0,0 +1,609 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=9.86 +@EndOfDesignText@ +Sub Class_Globals + Private Root As B4XView 'ignore + Private xui As XUI 'ignore + Dim ime As IME 'ignore +' Private lblHello As B4XView + Private ImageView1 As B4XView 'ignore +' Private Page3 As B4XPage3 + Private CustomListView1 As CustomListView 'ignore +' Private Tree As CLVTree +' Private b_colapsa As Button +' Private b_expande As Button +' Private Panel2 As Panel + Private clv_reglas2 As CustomListView + Private et_regla As EditText + Private p_rules As Panel + Private l_tit As Label +' Private l_rule As Label + Private p_reglas As Panel + Private l_tit2 As Label + Private et_regla2 As EditText + Private cb_activa As CheckBox + Private l_regla As Label + Private p_editarRegla As Panel + Private et_nombre As EditText + Private b_cancelar As Button + Private et_entra As EditText + Private et_sale As EditText + Private l_sale As Label + Private l_regla_1 As Label + Private l_regla_2 As Label + Private p_separador As Panel + Private r_destinatario_p As RadioButton + Private r_destinatario_g As RadioButton + Private r_destinatario_a As RadioButton + Dim destinatario As String = "Personas" + Private l_flecha As Label + Private fb_add As cvFloatingBtn + Private p_msgBox As Panel + Private l_msgBoxTitle As Label + Private l_msgBoxText As Label + Private b_msgBoxYes As Button + Private b_msgBoxNo As Button + Private p_sombra As Panel + Private p_contestacion As Panel + Private l_sale2 As Label + Private et_sale2 As EditText + Private p_recibimos As Panel + Private l_entra As Label + Private p_contactosEspecificos As Panel + Private et_contEsp As EditText + Private l_contEsp As Label + Dim contactsPermission As Boolean = False + Private clv_contactPicker As CustomListView + Private PCLV As PreoptimizedCLV + Private l_contact As Label + Private cb_selectContact As CheckBox + Private p_contacts As Panel + Private p_contactPicker As Panel + Dim contactosEspecificos As List + Private p_conEsp As Panel + Private b_guardaConEsp As Button + Private et_conEsp As EditText + Private et_conEsp2 As EditText + Private b_getContacts As Button + Dim listaReglasContestaciones As List + Private b_addET As Button + Private ScrollView1 As ScrollView + Private l_idRegla As Label +End Sub + +'You can add more parameters here. +Public Sub Initialize + +End Sub + +'This event will be called once, before the page becomes visible. +Private Sub B4XPage_Created (Root1 As B4XView) + Root = Root1 + 'load the layout to Root + Root.LoadLayout("Reglas") +' Root.LoadLayout("floatbutton_layout") + B4XPages.SetTitle(Me, "Reglas") +' Page3 = B4XPages.GetPage("Page 3") + contactosEspecificos.Initialize + PCLV.Initialize(Me, "PCLV", clv_contactPicker) + PCLV_AddItems + muestraReglas +End Sub + +Private Sub B4XPage_Appear + If Starter.logger Then Log("======================= REGLAS =====================") + Subs.traeReglas +' NotificationService.mapReglas = Subs.traeReglas +' clv_reglas2.Clear +' clv_reglas2.PressedColor = Colors.Transparent +' For Each m As Map In NotificationService.mapReglas.Values +' clv_reglas2.Add(CreateListItem(m.get("id"), m.get("nombre"), "Recibimos:", m.Get("recibe"), "Contestamos:", m.Get("contesta"), m.Get("activa"), 386dip, 90dip), m.get("id")) +' Next +' p_editarRegla.Visible = False +' p_sombra.Visible = False +' p_reglas.Width = Root.Width - 20 +' Subs.centraPanel(p_editarRegla, Root.Width) +End Sub + +Sub clv_contactPicker_VisibleRangeChanged (FirstIndex As Int, LastIndex As Int) + For Each i As Int In PCLV.VisibleRangeChanged(FirstIndex, LastIndex) + Dim item As CLVItem = clv_contactPicker.GetRawListItem(i) + Dim pnl As B4XView = xui.CreatePanel("") + pnl.Color = Colors.White + item.Color = Colors.White + item.Panel.AddView(pnl, 0, 0, item.Panel.Width, item.Panel.Height) + 'Create the item layout + pnl.LoadLayout("contactItem") + cb_selectContact.Tag = item.Value + l_contact.Text = item.Value + Next +End Sub + +Sub PCLV_AddItems + For Each contact As String In Subs.getContactos + PCLV.AddItem(40dip, xui.Color_White, contact) + Next + PCLV.Commit +End Sub + +'Return the hint that will be displayed when the user fast scrolls the list. It can be a string or CSBuilder. +Sub PCLV_HintRequested (Index As Int) As Object + Dim word As String = clv_contactPicker.GetValue(Index) + Return word +End Sub + +Sub muestraReglas + NotificationService.mapReglas = Subs.traeReglas +' Log("mapReglas=" & NotificationService.mapReglas) + clv_reglas2.Clear + clv_reglas2.PressedColor = Colors.Transparent +' clv_reglas2.AsView.Color = Colors.red + For Each m As Map In NotificationService.mapReglas.Values + clv_reglas2.Add(CreateListItem(m.get("id"), m.get("nombre"), "Recibimos:", m.Get("recibe"), "Contestamos:", m.Get("contesta"), m.Get("activa"), 386dip, 90dip), m.get("id")) + Next + p_editarRegla.Visible = False + p_sombra.Visible = False + p_reglas.Width = Root.Width + p_reglas.Height = Root.Height - 20 + fb_add.Top = p_reglas.Height - 50dip + fb_add.Left = p_reglas.Width - 50dip + clv_reglas2.GetBase.SetLayoutAnimated(0, 5dip, 5dip, Root.Width + 10, Root.Height) 'Cambiamos el tamaño y posición de la lista de reglas + clv_reglas2.Base_Resize(clv_reglas2.GetBase.Width, clv_reglas2.GetBase.Height) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. + p_sombra.Width = Root.Width + p_sombra.Height = Root.Height + If Starter.logger Then Log($"${Root.Width}, ${p_reglas.Width}, ${p_sombra.Width}, ${clv_reglas2.AsView.Width }"$) + Subs.centraPanel(p_editarRegla, Root.Width) +' Subs.centraPanel(p_sombra, Root.Width) +End Sub + +Sub CreateListItem(id As Int, nom As String, tit As String, rule As String, tit2 As String, rule2 As String, activa As Int, Width As Int, Height As Int) As Panel + Dim p As B4XView = xui.CreatePanel("") + Dim active As Boolean = False +' Private pLeft = p_rules.left + If activa = 1 Then active = True + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("ruleItem") + l_tit.Text = tit + l_regla_1.Text = rule + l_tit2.Text = tit2 + l_regla_2.Text = rule2 + p_rules.Width = Root.Width - 10dip + Subs.SetButtonTintList(cb_activa, Colors.red, Colors.RGB(7, 183, 0)) + If nom.IndexOf(".") > -1 Then + Private cuantos As Int = Subs.CountChars(nom, ".") +' Log(cuantos) + Private leftOffs As Int = 15 + If cuantos > 0 Then leftOffs = leftOffs * cuantos + p_rules.Left = p_rules.Left + leftOffs + p_rules.Width = p_rules.Width - leftOffs + l_regla_1.Width = l_regla_1.Width - leftOffs + l_regla_2.Width = l_regla_2.Width - leftOffs + cb_activa.Left = cb_activa.Left - leftOffs + Dim cd1 As ColorDrawable + cd1.Initialize2(Colors.White, 30, 5, Colors.Red) + l_regla.TextColor = Colors.red +' l_flecha.TextColor = Colors.red +' p_rules.Color = Colors.RGB(209, 0, 0) + p_rules.Background = cd1 + + If cuantos > 0 Then + l_flecha.Visible = True + l_regla.Left = l_regla.Left + 40 +' If cuantos = 2 Then p_rules.Color = Colors.RGB(134, 246, 126) +' If cuantos > 2 Then p_rules.Color = Colors.RGB(217, 217, 217) + If cuantos = 2 Then + cd1.Initialize2(Colors.White, 30, 5, Colors.Gray) + l_regla.TextColor = Colors.Gray +' l_flecha.TextColor = Colors.Gray + End If + If cuantos = 3 Then + cd1.Initialize2(Colors.White, 30, 6, Colors.RGB(255, 140, 125)) + l_regla.TextColor = Colors.RGB(255, 140, 125) +' l_flecha.TextColor = Colors.RGB(255, 140, 125) + End If + If cuantos > 3 Then + cd1.Initialize2(Colors.White, 30, 6, Colors.RGB(250, 161, 38)) + l_regla.TextColor = Colors.RGB(250, 161, 38) +' l_regla.TextColor = Colors.RGB(250, 161, 38) + End If + p_rules.Background = cd1 + End If + End If + + Dim su As StringUtils + ' recalculate new heights +' Dim prhTemp As Int = p_rules.Height + l_regla_1.height = su.MeasureMultilineTextHeight(l_regla_1, l_regla_1.Text) + l_regla_2.height = su.MeasureMultilineTextHeight(l_regla_2, l_regla_2.Text) + p_separador.Top = l_regla_1.Top + l_regla_1.Height + 10 + l_tit2.Top = p_separador.Top + 20 + l_regla_2.Top = l_tit2.top + p_rules.Height = l_regla_1.Height + l_regla_2.Height + 110 + p.SetLayoutAnimated(0, 0, 0, Width, p_rules.Height +10) + + cb_activa.Checked = active + cb_activa.Tag = id + l_regla.Text = nom + l_regla.Tag = id + Return p +End Sub + +'You can see the list of page related events in the B4XPagesManager object. The event name is B4XPage. +Sub b_1_Click +' B4XPages.ShowPage("Page 3") +End Sub + +Sub btnSignOut_Click +' Page3.ClearImage +' UpdateImage +' B4XPages.ShowPageAndRemovePreviousPages("MainPage") +End Sub + +Private Sub cb_activa_CheckedChange(Checked As Boolean) + Dim chk As CheckBox = Sender +' if starter.showLogs then Log(Checked & " | " & chk.tag ) + If chk.Tag <> Null And chk.Tag <> "" Then + Dim p_regla As Panel = Sender.As(View).Parent.As(Panel) +' if starter.showLogs then Log("|"&p_regla.NumberOfViews) + Private idRegla As Int = chk.tag + Private activa As Boolean = Checked +' Private recibimos As String = p_regla.GetView(1).as(Label).text +' Private mandamos As String = p_regla.GetView(3).as(Label).text + If Starter.showLogs Then Log("|"&p_regla.GetView(5)) + Subs.guardaRegla(idRegla, activa) + NotificationService.mapReglas = Subs.traeReglas + End If +' Log(NotificationService.mapReglas) +End Sub + +'Borramos la regla. +Sub cb_activa_LongClick + Private chk As CheckBox = Sender + If Starter.showLogs Then Log(chk.tag) + p_msgBox.Top = (Root.Height/2) - (p_msgBox.Height/2) + Subs.centraPanel(p_msgBox, Root.Width) + l_msgBoxTitle.Text = "Borrar regla" + l_msgBoxText.text = $"¿Seguro que desea borrar la regla ${chk.tag}?"$ + p_msgBox.Visible = True + b_msgBoxYes.Tag = chk.tag + p_msgBox.Tag = clv_reglas2.GetItemFromView(Sender.As(View)) + If Starter.showLogs Then LogColor(p_msgBox.tag, Colors.Magenta) +' if starter.showLogs then LogColor(clv_reglas2.Size,Colors.Magenta) +End Sub + +Private Sub b_msgBoxYes_Click + p_msgBox.Visible = False + If Starter.showLogs Then Log(Sender.As(Button).tag) + Subs.borrarRegla(Sender.As(Button).tag) + NotificationService.mapReglas = Subs.traeReglas +' B4XPage_Appear + clv_reglas2.RemoveAt(p_msgBox.Tag) +' muestraReglas +End Sub + +Private Sub b_msgBoxNo_Click + p_msgBox.Visible = False +End Sub + +Sub p_msgBox_Click + 'Do nothing +End Sub + +Private Sub et_regla_TextChanged (Old As String, New As String) + Dim p_regla As Panel = Sender.As(View).Parent.As(Panel) + Private cb As CheckBox = p_regla.GetView(2) + cb.Checked = False +' Log(cb.checked) +End Sub + +Private Sub et_regla2_TextChanged (Old As String, New As String) + Dim p_regla As Panel = Sender.As(View).Parent.As(Panel) + Private cb As CheckBox = p_regla.GetView(2) + cb.Checked = False +' Log(cb.checked) +End Sub + +Private Sub L_regla_LongClick +' et_nombre.Text = Sender.As(Label).text +' et_nombre.Tag = Sender.As(Label).tag +' Log(Sender.As(Label)) +'' Log(Sender.As(Label).Tag & "|"&NotificationService.mapReglas) +' Private d As Map = NotificationService.mapReglas.Get(Sender.As(Label).tag) +'' Log(d) +' et_entra.Text = d.Get("recibe") +' et_sale.Text = d.Get("contesta") +' p_editarRegla.visible = True +' RecalculateHeightViews +End Sub + +Private Sub b_guardar_Click + For i = 0 To listaReglasContestaciones.Size -1 + et_sale.Text = et_sale.Text & "//" & listaReglasContestaciones.Get(i).As(EditText).text + Next + If Starter.showLogs Then Log(et_sale.text) + Subs.actualizaRegla(et_nombre.Tag, et_nombre.text, et_entra.Text, et_sale.text, r_destinatario_p.tag, et_contEsp.text) +' NotificationService.mapReglas = Subs.traeReglas + muestraReglas + p_editarRegla.Visible = False + p_sombra.Visible = False + ime.HideKeyboard +End Sub + +Private Sub b_cancelar_Click + p_editarRegla.Visible = False + p_editarRegla.SendToBack +' ScrollView1.Visible = False + p_sombra.Visible = False + ime.HideKeyboard +End Sub + +Sub RecalculateHeightViews +' Log("Recalcula") + Dim su As StringUtils + 'Recalculate new heights + et_entra.height = su.MeasureMultilineTextHeight(et_entra, et_entra.Text) + 60 + et_sale.height = su.MeasureMultilineTextHeight(et_sale, et_sale.Text)+ 60 + et_contEsp.Height = su.MeasureMultilineTextHeight(et_contEsp, et_contEsp.Text)+ 60 + p_recibimos.Height = et_entra.Height + 20 + p_contestacion.Height = et_sale.Height + 20 + p_contactosEspecificos.Height = et_contEsp.Height + 20 + ' Recalculate new vertical positions + p_recibimos.Top =l_entra.Top + l_entra.Height + 5 + l_sale.Top = p_recibimos.Top + p_recibimos.height + 5 + p_contestacion.Top = l_sale.Top + l_sale.height + 5 + If listaReglasContestaciones.Size > 0 Then + For j = 0 To listaReglasContestaciones.Size - 1 + listaReglasContestaciones.Get(j).As(EditText).Height = su.MeasureMultilineTextHeight(listaReglasContestaciones.Get(j).As(EditText), listaReglasContestaciones.Get(j).As(EditText).Text) + 60 + p_contestacion.Height = p_contestacion.Height + listaReglasContestaciones.Get(j).As(EditText).Height - 15 + Next + End If + ScrollView1.Panel.Height = p_recibimos.Height + p_contestacion.Height + p_contactosEspecificos.Height + 500 + For n = 0 To listaReglasContestaciones.Size - 1 + If n = 0 Then + listaReglasContestaciones.Get(n).As(EditText).Top = et_sale.Top + et_sale.Height - 15 + Else if n > 0 Then + listaReglasContestaciones.Get(n).As(EditText).Top = listaReglasContestaciones.Get(n-1).As(EditText).Top + listaReglasContestaciones.Get(n-1).As(EditText).Height - 15 + End If +' LogColor(listaReglasContestaciones.Get(n).As(EditText).Top, Colors.red) + Next + r_destinatario_p.Top = p_contestacion.Top + p_contestacion.Height + r_destinatario_g.Top = r_destinatario_p.top + r_destinatario_a.Top = r_destinatario_p.top + l_contEsp.Top = r_destinatario_p.Top + r_destinatario_p.Height + b_addET.Top = l_sale.top - 1 + b_getContacts.Top = l_contEsp.top - 5 + p_contactosEspecificos.Top = l_contEsp.Top + l_contEsp.Height +End Sub + +Private Sub et_entra_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub et_sale_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub et_sale2_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub et_contEsp_TextChanged (Old As String, New As String) + RecalculateHeightViews +End Sub + +Private Sub clv_reglas2_ItemClick (Index As Int, Value As Object) + If Starter.showLogs Then Log(Index &"|" & Value) + listaReglasContestaciones.Initialize +' p_editarRegla.Visible = True +' p_editarRegla.BringToFront + ScrollView1.Panel.RemoveAllViews + ScrollView1.Panel.LoadLayout("editaRegla") + ScrollView1.Height = p_editarRegla.Height * 0.9 + ScrollView1.Panel.Height = ScrollView1.Height + Private et_sale As EditText + et_sale.Initialize("et_sale") + et_sale.TextColor = Colors.Black + et_sale.TextSize = 15 + p_contestacion.RemoveAllViews + p_contestacion.AddView(et_sale, 10, 10, (p_contestacion.Width*0.95), 30dip) + Private d As Map = NotificationService.mapReglas.Get(Value) + If Starter.showLogs Then Log(d) + et_entra.InputType = Bit.Or(0x00080000, 0x00000090) 'TYPE_TEXT_FLAG_NO_SUGGESTIONS | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + et_entra.SingleLine = False + et_sale.InputType = Bit.Or(0x00080000, 0x00000090) 'TYPE_TEXT_FLAG_NO_SUGGESTIONS | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + et_sale.SingleLine = False + et_contEsp.InputType = Bit.Or(0x00080000, 0x00000090) 'TYPE_TEXT_FLAG_NO_SUGGESTIONS | TYPE_TEXT_VARIATION_VISIBLE_PASSWORD + et_contEsp.SingleLine = False + et_nombre.Tag = Value + et_nombre.Text = d.Get("nombre") + l_idRegla.Text = "(" & d.Get("id") & ")" + et_entra.Text = d.Get("recibe") + Private ets() As String = Regex.Split("//", d.Get("contesta")) 'Dividimos el regla en sus multiples respuestas. +' et_sale.Text = d.Get("contesta") + et_sale.Text = ets(0).trim + If ets.Length > 1 Then + For x = 1 To ets.Length - 1 + addET(ets(x).Trim) + Next + End If + destinatario = "Personas" + If d.Get("destinatario") <> Null Then destinatario = d.Get("destinatario") + If destinatario = "Personas" Then r_destinatario_p.Checked = True + If destinatario = "Grupos" Then r_destinatario_g.Checked = True + If destinatario = "Ambos" Then r_destinatario_a.Checked = True + et_contEsp.Text = d.Get("contactoEspecifico") + r_destinatario_p.Tag = destinatario + p_editarRegla.visible = True + p_sombra.Visible = True + If Starter.showLogs Then Log(contactsPermission) +' If contactsPermission Then +' Dim res As List = InputMultiList(Subs.getContactos, "Select") +' Log(res) +' End If + RecalculateHeightViews +End Sub + +Private Sub r_destinatario_p_CheckedChange(Checked As Boolean) + If Starter.showLogs Then Log(Sender.As(RadioButton).text & "|" &Checked) + destinatario = Sender.As(RadioButton).text + r_destinatario_p.Tag = destinatario +End Sub + +Private Sub r_destinatario_g_CheckedChange(Checked As Boolean) + If Starter.showLogs Then Log(Sender.As(RadioButton).text & "|" &Checked) + destinatario = Sender.As(RadioButton).text + r_destinatario_p.Tag = destinatario +End Sub + +Private Sub r_destinatario_a_CheckedChange(Checked As Boolean) +' Log(Sender.As(RadioButton).text & "|" &Checked) + destinatario = Sender.As(RadioButton).text + r_destinatario_p.Tag = destinatario +End Sub + +'Agregamos regla. +Sub fb_add_Clicked(X As Float,Y As Float) +' ToastMessageShow("Button Clicked",False) + Subs.agregaRegla + NotificationService.mapReglas = Subs.traeReglas +' B4XPage_Appear + muestraReglas +End Sub + +Private Sub B4XPage_CloseRequest As ResumableSub + Sleep(0) + If Starter.showLogs Then Log("B4XPage_CloseRequest") +' if starter.showLogs then Log(p_contactPicker.Visible) + If p_contactPicker.Visible = True Then + p_contactPicker.Visible = False + Return False + End If + If p_editarRegla.Visible Then + p_editarRegla.Visible = False + p_sombra.Visible = False + Return False + End If + Return True +End Sub + +Private Sub p_editarRegla_Click + 'Nothing here. +End Sub + +Private Sub p_sombra_Click + 'Nothing here. +End Sub + +Sub muestraContactos + If Starter.showLogs Then Log("muestraContactos") + p_contactPicker.Visible = True + ime.HideKeyboard + p_contactPicker.left = 0 + p_contactPicker.Top = 0 + p_contactPicker.Width = Root.Width + p_contactPicker.Height = Root.Height + clv_contactPicker.GetBase.SetLayoutAnimated(0, 5dip, 30dip, Root.Width - 10, Root.Height * 0.68) 'Cambiamos el tamaño y posición de la lista de productos + clv_contactPicker.Base_Resize(clv_contactPicker.GetBase.Width, clv_contactPicker.GetBase.Height) 'Cambiamos el tamaño del panel interno de la lista para que ajuste al nuevo tamaño. + p_conEsp.Top = clv_contactPicker.GetBase.Top + clv_contactPicker.GetBase.Height + 20 + b_guardaConEsp.top = p_conEsp.Top + p_conEsp.Height + 20 +End Sub + +Sub CreateContactsItem(nom As String, Width As Int, Height As Int) As Panel 'ignore + Dim p As B4XView = xui.CreatePanel("") + p.SetLayoutAnimated(0, 0, 0, Width, Height) + p.LoadLayout("contactItem") + l_contact.Text = nom + p_contacts.Height = Height +' Log($"${p_contacts.Height}, ${l_contact.Height}"$) + cb_selectContact.Top = (p_contacts.Height/2) - (cb_selectContact.Height/2) + l_contact.Top = (p_contacts.Height/2) - (l_contact.Height/2) + Subs.SetButtonTintList(cb_selectContact, Colors.red, Colors.RGB(7, 183, 0)) + cb_selectContact.Tag = nom + l_contact.Text = nom + Return p +End Sub + +Private Sub clv_contactPicker_ItemClick (Index As Int, Value As Object) +' Log($"${Index}, ${Value}"$ ) + Dim cb As CheckBox = clv_contactPicker.GetPanel(Index).GetView(0).GetView(0) + If cb.Checked Then cb.Checked = False Else cb.Checked = True +End Sub + +Private Sub et_contEsp_FocusChanged (HasFocus As Boolean) +' If HasFocus Then +' muestraContactos +' End If +End Sub + +Private Sub cb_selectContact_CheckedChange(Checked As Boolean) + If Starter.showLogs Then Log(Sender.As(CheckBox).tag) + et_conEsp2.Text = "" + If Checked Then + contactosEspecificos.Add(Sender.As(CheckBox).tag) 'Si no está en la lista, lo agregamos. + Else + If contactosEspecificos.IndexOf(Sender.As(CheckBox).tag) > -1 Then + contactosEspecificos.RemoveAt(contactosEspecificos.IndexOf(Sender.As(CheckBox).tag)) 'Si ya esta en la lista lo quitamos. + End If + End If +' if starter.showLogs then Log(contactosEspecificos) + For Each c In contactosEspecificos + If et_conEsp2.Text <> "" Then et_conEsp2.Text = et_conEsp2.Text & ", " & c Else et_conEsp2.Text = c + Next +End Sub + +Private Sub b_guardaConEsp_Click + Dim l As List + l.initialize + Dim t() As String = Regex.Split(",", et_contEsp.text) + For i = 0 To t.Length-1 + l.add(t(i).trim) + Next + contactosEspecificos.AddAll(l) + contactosEspecificos = Subs.removeListDuplicates(contactosEspecificos) + et_contEsp.Text = "" + For Each c In contactosEspecificos + If et_contEsp.Text <> "" Then et_contEsp.Text = et_contEsp.Text & ", " & c Else et_contEsp.Text = c + Next + et_contEsp.text = et_contEsp.text.Replace(", ,", ",") + p_contactPicker.Visible = False + et_conEsp2.Text = "" + contactosEspecificos.Clear + clv_contactPicker.Clear + PCLV_AddItems +End Sub + +Private Sub b_getContacts_Click + muestraContactos +End Sub + +Sub addET(texto As String) + Dim etX As EditText + etX.Initialize("etX") + etX.TextColor = Colors.Black + etX.TextSize = 12 + etX.Tag = listaReglasContestaciones.size + listaReglasContestaciones.add(etX) + Dim newTop As Int = et_sale.top + et_sale.Height + If listaReglasContestaciones.Size > 0 Then + For k = 0 To listaReglasContestaciones.Size - 1 + newTop = newTop + listaReglasContestaciones.Get(k).As(EditText).Height + Next + End If + p_contestacion.AddView(etX, et_sale.left, newTop, et_sale.Width, 35dip) + etX.Text = texto +End Sub + +Private Sub b_addET_Click + addET("") +' Log("Agregamos ET, " & listaReglasContestaciones.size & "|" & etX.Tag & ", top=" & newTop) + RecalculateHeightViews +' Log(etX.top) +End Sub + +Sub etX_TextChanged (Old As String, New As String) +' Log(Sender.As(EditText).tag) + RecalculateHeightViews +End Sub diff --git a/B4A/DBRequestManager.bas b/B4A/DBRequestManager.bas new file mode 100644 index 0000000..140d51d --- /dev/null +++ b/B4A/DBRequestManager.bas @@ -0,0 +1,271 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=6.8 +@EndOfDesignText@ +'Class module +Sub Class_Globals + Private mTarget As Object + Type DBResult (Tag As Object, Columns As Map, Rows As List) + Type DBCommand (Name As String, Parameters() As Object) + Private link As String + Private bc As ByteConverter + Private T_NULL = 0, T_STRING = 1, T_SHORT = 2, T_INT = 3, T_LONG = 4, T_FLOAT = 5 _ + ,T_DOUBLE = 6, T_BOOLEAN = 7, T_BLOB = 8 As Byte + Private VERSION As Float = 0.9 + Private tempArray(1) As Object + Dim jobTagAnterior As String = "" 'Mod por CHV - 211027 +End Sub + +'Target - The module that handles JobDone (usually Me). +'ConnectorLink - URL of the Java server. +Public Sub Initialize (Target As Object, ConnectorLink As String) + mTarget = Target + link = ConnectorLink +End Sub + +'Sends a query request. +'Command - Query name and parameters. +'Limit - Maximum rows to return or 0 for no limit. +'Tag - An object that will be returned in the result. +'Timeout - The http request timeout in ms, or 0 if default (30 secs) +Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object, Timeout As Int) 'Mod por CHV, agregué el parametro Timeout - 211229 + Dim j As HttpJob + Dim ms As OutputStream + Dim out2 As OutputStream = StartJob(j,ms, Tag) + WriteObject(Command.Name, out2) + WriteInt(Limit, out2) + WriteList(Command.Parameters, out2) + out2.Close + j.PostBytes(link & "?method=query", ms.ToBytesArray) + If Timeout <> 0 Then j.GetRequest.Timeout = Timeout +End Sub + +'Executes a batch of (non-select) commands. +'ListOfCommands - List of the commands that will be executes. +'Tag - An object that will be returned in the result. +Public Sub ExecuteBatch(ListOfCommands As List, Tag As Object) + Dim j As HttpJob + Dim ms As OutputStream + Dim out2 As OutputStream = StartJob(j,ms, Tag) + WriteInt(ListOfCommands.Size, out2) + For Each Command As DBCommand In ListOfCommands + WriteObject(Command.Name, out2) + WriteList(Command.Parameters, out2) + Next + out2.Close + j.PostBytes(link & "?method=batch", ms.ToBytesArray) +End Sub + +'Similar to ExecuteBatch. Sends a single command. +Public Sub ExecuteCommand(Command As DBCommand, Tag As Object) + ExecuteBatch(Array As DBCommand(Command), Tag) +End Sub + +Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream + j.Initialize("DBRequest", mTarget) + j.Tag = Tag + MemoryStream.InitializeToBytesArray(0) + Dim compress As CompressedStreams + Dim out As OutputStream = compress.WrapOutputStream(MemoryStream, "gzip") + WriteObject(VERSION, out) + Return out +End Sub + +Private Sub WriteList(Parameters As List, out As OutputStream) + Dim data() As Byte + If Parameters = Null Or Parameters.IsInitialized = False Then + Dim Parameters As List + Parameters.Initialize + End If + data = bc.IntsToBytes(Array As Int(Parameters.Size)) + out.WriteBytes(data, 0, data.Length) + For Each o As Object In Parameters + WriteObject(o, out) + Next +End Sub + +Private Sub WriteObject(o As Object, out As OutputStream) + Dim data() As Byte + tempArray(0) = o + If tempArray(0) = Null Then + out.WriteBytes(Array As Byte(T_NULL), 0, 1) + Else If tempArray(0) Is Short Then + out.WriteBytes(Array As Byte(T_SHORT), 0, 1) + data = bc.ShortsToBytes(Array As Short(o)) + Else If tempArray(0) Is Int Then + out.WriteBytes(Array As Byte(T_INT), 0, 1) + data = bc.IntsToBytes(Array As Int(o)) + Else If tempArray(0) Is Float Then + out.WriteBytes(Array As Byte(T_FLOAT), 0, 1) + data = bc.FloatsToBytes(Array As Float(o)) + Else If tempArray(0) Is Double Then + out.WriteBytes(Array As Byte(T_DOUBLE), 0, 1) + data = bc.DoublesToBytes(Array As Double(o)) + Else If tempArray(0) Is Long Then + out.WriteBytes(Array As Byte(T_LONG), 0, 1) + data = bc.LongsToBytes(Array As Long(o)) + Else If tempArray(0) Is Boolean Then + out.WriteBytes(Array As Byte(T_BOOLEAN), 0, 1) + Dim b As Boolean = 0 + Dim data(1) As Byte + If b Then data(0) = 1 Else data(0) = 0 + Else If GetType(tempArray(0)) = "[B" Then + data = o + out.WriteBytes(Array As Byte(T_BLOB), 0, 1) + WriteInt(data.Length, out) + Else 'If o Is String Then (treat all other values as string) + out.WriteBytes(Array As Byte(T_STRING), 0, 1) + data = bc.StringToBytes(o, "UTF8") + WriteInt(data.Length, out) + End If + If data.Length > 0 Then out.WriteBytes(data, 0, data.Length) +End Sub + +Private Sub ReadObject(In As InputStream) As Object + Dim data(1) As Byte + In.ReadBytes(data, 0, 1) + Select data(0) + Case T_NULL + Return Null + Case T_SHORT + Dim data(2) As Byte + Return bc.ShortsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_INT + Dim data(4) As Byte + Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_LONG + Dim data(8) As Byte + Return bc.LongsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_FLOAT + Dim data(4) As Byte + Return bc.FloatsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_DOUBLE + Dim data(8) As Byte + Return bc.DoublesFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_BOOLEAN + Dim b As Byte = ReadByte(In) + Return b = 1 + Case T_BLOB + Dim len As Int = ReadInt(In) + Dim data(len) As Byte + Return ReadBytesFully(In, data, data.Length) + Case Else + Dim len As Int = ReadInt(In) + Dim data(len) As Byte + ReadBytesFully(In, data, data.Length) + Return BytesToString(data, 0, data.Length, "UTF8") + End Select +End Sub + +Private Sub ReadBytesFully(In As InputStream, Data() As Byte, Len As Int) As Byte() + Dim count = 0, read As Int + Do While count < Len And read > -1 + read = In.ReadBytes(Data, count, Len - count) + count = count + read + Loop + Return Data +End Sub + +Private Sub WriteInt(i As Int, out As OutputStream) + Dim data() As Byte + data = bc.IntsToBytes(Array As Int(i)) + out.WriteBytes(data, 0, data.Length) +End Sub + +Private Sub ReadInt(In As InputStream) As Int + Dim data(4) As Byte + Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) +End Sub + +Private Sub ReadByte(In As InputStream) As Byte + Dim data(1) As Byte + In.ReadBytes(data, 0, 1) + Return data(0) +End Sub + +'Handles the Job result and returns a DBResult. +Public Sub HandleJob(Job As HttpJob) As DBResult +' Dim start As Long = DateTime.Now + Dim In As InputStream = Job.GetInputStream + Dim cs As CompressedStreams + In = cs.WrapInputStream(In, "gzip") + Dim serverVersion As Float = ReadObject(In) 'ignore + Dim method As String = ReadObject(In) + Dim table As DBResult + table.Initialize + table.Columns.Initialize + table.rows.Initialize + table.Tag = Job.Tag + If jobTagAnterior <> Job.Tag Then LogColor("HandleJob: '"&Job.Tag&"'", Colors.Blue) 'Mod por CHV - 211023 + jobTagAnterior = Job.Tag 'Mod por CHV - 211023 + If method = "query" Then + Dim numberOfColumns As Int = ReadInt(In) + For i = 0 To numberOfColumns - 1 + table.Columns.Put(ReadObject(In), i) + Next + Do While ReadByte(In) = 1 + Dim rowObjects(numberOfColumns) As Object + table.rows.Add(rowObjects) + For col = 0 To numberOfColumns - 1 + Dim o As Object = ReadObject(In) + rowObjects(col) = o + Next + Loop + Else If method = "batch" Then + table.Columns.Put("AffectedRows", 0) + Dim rows As Int = ReadInt(In) + For i = 0 To rows - 1 + table.rows.Add(Array As Object(ReadInt(In))) + Next + End If + In.Close +' Log("HandleJob: " & (DateTime.Now - start)) + Return table +End Sub +'Reads a file and returns the file as a bytes array. +Public Sub FileToBytes(Dir As String, FileName As String) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Dim In As InputStream = File.OpenInput(Dir, FileName) + File.Copy2(In, out) + out.Close + Return out.ToBytesArray +End Sub +'Converts an image to a bytes array (for BLOB fields). +Public Sub ImageToBytes(Image As Bitmap) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Image.WriteToStream(out, 100, "JPEG") + out.Close + Return out.ToBytesArray +End Sub +'Converts a bytes array to an image (for BLOB fields). +Public Sub BytesToImage(bytes() As Byte) As Bitmap + Dim In As InputStream + In.InitializeFromBytesArray(bytes, 0, bytes.Length) + Dim bmp As Bitmap + bmp.Initialize2(In) + Return bmp +End Sub +'Prints the table to the logs. +Public Sub PrintTable(Table As DBResult) + If Starter.logger Then Log("Tag: " & Table.Tag & ", Columns: " & Table.Columns.Size & ", Rows: " & Table.Rows.Size) + Dim sb As StringBuilder + sb.Initialize + For Each col In Table.Columns.Keys + sb.Append(col).Append(TAB) + Next + If Starter.logger Then Log(sb.ToString) + For Each row() As Object In Table.Rows + Dim sb As StringBuilder + sb.Initialize + For Each record As Object In row + sb.Append(record).Append(TAB) + Next + ToastMessageShow(sb.ToString, True) + Next +End Sub + + \ No newline at end of file diff --git a/B4A/DBRequestManagerV1.bas b/B4A/DBRequestManagerV1.bas new file mode 100644 index 0000000..b10711a --- /dev/null +++ b/B4A/DBRequestManagerV1.bas @@ -0,0 +1,271 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=6.8 +@EndOfDesignText@ +'Class module +Sub Class_Globals + Private mTarget As Object + Type DBResult (Tag As Object, Columns As Map, Rows As List) + Type DBCommand (Name As String, Parameters() As Object) + Private link As String + Private bc As ByteConverter + Private T_NULL = 0, T_STRING = 1, T_SHORT = 2, T_INT = 3, T_LONG = 4, T_FLOAT = 5 _ + ,T_DOUBLE = 6, T_BOOLEAN = 7, T_BLOB = 8 As Byte + Private VERSION As Float = 0.9 + Private tempArray(1) As Object + Dim jobTagAnterior As String = "" 'Mod por CHV - 211027 +End Sub + +'Target - The module that handles JobDone (usually Me). +'ConnectorLink - URL of the Java server. +Public Sub Initialize (Target As Object, ConnectorLink As String) + mTarget = Target + link = ConnectorLink +End Sub + +'Sends a query request. +'Command - Query name and parameters. +'Limit - Maximum rows to return or 0 for no limit. +'Tag - An object that will be returned in the result. +'Timeout - The http request timeout in ms, or 0 if default (30 secs) +Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object, Timeout As Int) 'Mod por CHV, agregué el parametro Timeout - 211229 + Dim j As HttpJob + Dim ms As OutputStream + Dim out2 As OutputStream = StartJob(j,ms, Tag) + WriteObject(Command.Name, out2) + WriteInt(Limit, out2) + WriteList(Command.Parameters, out2) + out2.Close + j.PostBytes(link & "?method=query", ms.ToBytesArray) + If Timeout <> 0 Then j.GetRequest.Timeout = Timeout +End Sub + +'Executes a batch of (non-select) commands. +'ListOfCommands - List of the commands that will be executes. +'Tag - An object that will be returned in the result. +Public Sub ExecuteBatch(ListOfCommands As List, Tag As Object) + Dim j As HttpJob + Dim ms As OutputStream + Dim out2 As OutputStream = StartJob(j,ms, Tag) + WriteInt(ListOfCommands.Size, out2) + For Each Command As DBCommand In ListOfCommands + WriteObject(Command.Name, out2) + WriteList(Command.Parameters, out2) + Next + out2.Close + j.PostBytes(link & "?method=batch", ms.ToBytesArray) +End Sub + +'Similar to ExecuteBatch. Sends a single command. +Public Sub ExecuteCommand(Command As DBCommand, Tag As Object) + ExecuteBatch(Array As DBCommand(Command), Tag) +End Sub + +Private Sub StartJob(j As HttpJob, MemoryStream As OutputStream, Tag As Object) As OutputStream + j.Initialize("DBRequest", mTarget) + j.Tag = Tag + MemoryStream.InitializeToBytesArray(0) + Dim compress As CompressedStreams + Dim out As OutputStream = compress.WrapOutputStream(MemoryStream, "gzip") + WriteObject(VERSION, out) + Return out +End Sub + +Private Sub WriteList(Parameters As List, out As OutputStream) + Dim data() As Byte + If Parameters = Null Or Parameters.IsInitialized = False Then + Dim Parameters As List + Parameters.Initialize + End If + data = bc.IntsToBytes(Array As Int(Parameters.Size)) + out.WriteBytes(data, 0, data.Length) + For Each o As Object In Parameters + WriteObject(o, out) + Next +End Sub + +Private Sub WriteObject(o As Object, out As OutputStream) + Dim data() As Byte + tempArray(0) = o + If tempArray(0) = Null Then + out.WriteBytes(Array As Byte(T_NULL), 0, 1) + Else If tempArray(0) Is Short Then + out.WriteBytes(Array As Byte(T_SHORT), 0, 1) + data = bc.ShortsToBytes(Array As Short(o)) + Else If tempArray(0) Is Int Then + out.WriteBytes(Array As Byte(T_INT), 0, 1) + data = bc.IntsToBytes(Array As Int(o)) + Else If tempArray(0) Is Float Then + out.WriteBytes(Array As Byte(T_FLOAT), 0, 1) + data = bc.FloatsToBytes(Array As Float(o)) + Else If tempArray(0) Is Double Then + out.WriteBytes(Array As Byte(T_DOUBLE), 0, 1) + data = bc.DoublesToBytes(Array As Double(o)) + Else If tempArray(0) Is Long Then + out.WriteBytes(Array As Byte(T_LONG), 0, 1) + data = bc.LongsToBytes(Array As Long(o)) + Else If tempArray(0) Is Boolean Then + out.WriteBytes(Array As Byte(T_BOOLEAN), 0, 1) + Dim b As Boolean = 0 + Dim data(1) As Byte + If b Then data(0) = 1 Else data(0) = 0 + Else If GetType(tempArray(0)) = "[B" Then + data = o + out.WriteBytes(Array As Byte(T_BLOB), 0, 1) + WriteInt(data.Length, out) + Else 'If o Is String Then (treat all other values as string) + out.WriteBytes(Array As Byte(T_STRING), 0, 1) + data = bc.StringToBytes(o, "UTF8") + WriteInt(data.Length, out) + End If + If data.Length > 0 Then out.WriteBytes(data, 0, data.Length) +End Sub + +Private Sub ReadObject(In As InputStream) As Object + Dim data(1) As Byte + In.ReadBytes(data, 0, 1) + Select data(0) + Case T_NULL + Return Null + Case T_SHORT + Dim data(2) As Byte + Return bc.ShortsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_INT + Dim data(4) As Byte + Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_LONG + Dim data(8) As Byte + Return bc.LongsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_FLOAT + Dim data(4) As Byte + Return bc.FloatsFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_DOUBLE + Dim data(8) As Byte + Return bc.DoublesFromBytes(ReadBytesFully(In, data, data.Length))(0) + Case T_BOOLEAN + Dim b As Byte = ReadByte(In) + Return b = 1 + Case T_BLOB + Dim len As Int = ReadInt(In) + Dim data(len) As Byte + Return ReadBytesFully(In, data, data.Length) + Case Else + Dim len As Int = ReadInt(In) + Dim data(len) As Byte + ReadBytesFully(In, data, data.Length) + Return BytesToString(data, 0, data.Length, "UTF8") + End Select +End Sub + +Private Sub ReadBytesFully(In As InputStream, Data() As Byte, Len As Int) As Byte() + Dim count = 0, read As Int + Do While count < Len And read > -1 + read = In.ReadBytes(Data, count, Len - count) + count = count + read + Loop + Return Data +End Sub + +Private Sub WriteInt(i As Int, out As OutputStream) + Dim data() As Byte + data = bc.IntsToBytes(Array As Int(i)) + out.WriteBytes(data, 0, data.Length) +End Sub + +Private Sub ReadInt(In As InputStream) As Int + Dim data(4) As Byte + Return bc.IntsFromBytes(ReadBytesFully(In, data, data.Length))(0) +End Sub + +Private Sub ReadByte(In As InputStream) As Byte + Dim data(1) As Byte + In.ReadBytes(data, 0, 1) + Return data(0) +End Sub + +'Handles the Job result and returns a DBResult. +Public Sub HandleJob(Job As HttpJob) As DBResult +' Dim start As Long = DateTime.Now + Dim In As InputStream = Job.GetInputStream + Dim cs As CompressedStreams + In = cs.WrapInputStream(In, "gzip") + Dim serverVersion As Float = ReadObject(In) 'ignore + Dim method As String = ReadObject(In) + Dim table As DBResult + table.Initialize + table.Columns.Initialize + table.rows.Initialize + table.Tag = Job.Tag + If jobTagAnterior <> Job.Tag Then LogColor("HandleJob: '"&Job.Tag&"'", Colors.Blue) 'Mod por CHV - 211023 + jobTagAnterior = Job.Tag 'Mod por CHV - 211023 + If method = "query" Then + Dim numberOfColumns As Int = ReadInt(In) + For i = 0 To numberOfColumns - 1 + table.Columns.Put(ReadObject(In), i) + Next + Do While ReadByte(In) = 1 + Dim rowObjects(numberOfColumns) As Object + table.rows.Add(rowObjects) + For col = 0 To numberOfColumns - 1 + Dim o As Object = ReadObject(In) + rowObjects(col) = o + Next + Loop + Else If method = "batch" Then + table.Columns.Put("AffectedRows", 0) + Dim rows As Int = ReadInt(In) + For i = 0 To rows - 1 + table.rows.Add(Array As Object(ReadInt(In))) + Next + End If + In.Close +' Log("HandleJob: " & (DateTime.Now - start)) + Return table +End Sub +'Reads a file and returns the file as a bytes array. +Public Sub FileToBytes(Dir As String, FileName As String) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Dim In As InputStream = File.OpenInput(Dir, FileName) + File.Copy2(In, out) + out.Close + Return out.ToBytesArray +End Sub +'Converts an image to a bytes array (for BLOB fields). +Public Sub ImageToBytes(Image As Bitmap) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Image.WriteToStream(out, 100, "JPEG") + out.Close + Return out.ToBytesArray +End Sub +'Converts a bytes array to an image (for BLOB fields). +Public Sub BytesToImage(bytes() As Byte) As Bitmap + Dim In As InputStream + In.InitializeFromBytesArray(bytes, 0, bytes.Length) + Dim bmp As Bitmap + bmp.Initialize2(In) + Return bmp +End Sub +'Prints the table to the logs. +Public Sub PrintTable(Table As DBResult) + Log("Tag: " & Table.Tag & ", Columns: " & Table.Columns.Size & ", Rows: " & Table.Rows.Size) + Dim sb As StringBuilder + sb.Initialize + For Each col In Table.Columns.Keys + sb.Append(col).Append(TAB) + Next + Log(sb.ToString) + For Each row() As Object In Table.Rows + Dim sb As StringBuilder + sb.Initialize + For Each record As Object In row + sb.Append(record).Append(TAB) + Next + ToastMessageShow(sb.ToString, True) + Next +End Sub + + \ No newline at end of file diff --git a/B4A/DBRequestManagerV2.bas b/B4A/DBRequestManagerV2.bas new file mode 100644 index 0000000..93bff84 --- /dev/null +++ b/B4A/DBRequestManagerV2.bas @@ -0,0 +1,149 @@ +B4J=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=5.45 +@EndOfDesignText@ +'Requires support for resumable subs +'Class module + +Sub Class_Globals + Private mTarget As Object + Private link As String + Private VERSION As Float = 2 + +End Sub + +'Target - The module that handles JobDone (usually Me). +'ConnectorLink - URL of the Java server. +Public Sub Initialize (Target As Object, ConnectorLink As String) + mTarget = Target + link = ConnectorLink +End Sub + +'Sends a query request. +'Command - Query name and parameters. +'Limit - Maximum rows to return or 0 for no limit. +'Tag - An object that will be returned in the result. +Public Sub ExecuteQuery(Command As DBCommand, Limit As Int, Tag As Object, Timeout As Int) As HttpJob + Dim ser As B4XSerializator + Dim data() As Byte = ser.ConvertObjectToBytes(CreateMap("command": Command, "limit": Limit, "version": VERSION)) + Return SendJob(CreateJob, data, Tag, "query2", Timeout) +End Sub + +Private Sub SendJob(j As HttpJob, Data() As Byte, Tag As Object, Method As String, Timeout As Int) As HttpJob + j.Tag = Tag + j.PostBytes(link & "?method=" & Method , Data) + If Timeout <> 0 Then j.GetRequest.Timeout = Timeout + Return j +End Sub + +Private Sub CreateJob As HttpJob + Dim j As HttpJob + j.Initialize("DBRequest", mTarget) + Return j +End Sub + +'Executes a batch of (non-select) commands. +'ListOfCommands - List of the commands that will be executes. +'Tag - An object that will be returned in the result. +Public Sub ExecuteBatch(ListOfCommands As List, Tag As Object) As HttpJob + Dim j As HttpJob = CreateJob + ExecuteBatchImpl(j, ListOfCommands, Tag) + Return j +End Sub + +Private Sub ExecuteBatchImpl(Job As HttpJob, ListOfCommands As List, Tag As Object) + Dim ser As B4XSerializator + ser.ConvertObjectToBytesAsync(CreateMap("commands": ListOfCommands, "version": VERSION), "ser") + Wait For (ser) ser_ObjectToBytes (Success As Boolean, Bytes() As Byte) + If Success = False Then + Log("Error building command: " & LastException) + Return + End If + Dim ser As B4XSerializator = Sender + SendJob(Job, Bytes, Tag, "batch2", 0) +End Sub + + +'Similar to ExecuteBatch. Sends a single command. +Public Sub ExecuteCommand(Command As DBCommand, Tag As Object) As HttpJob + Return ExecuteBatch(Array As DBCommand(Command), Tag) +End Sub + +'Handles the Job result and returns a DBResult. +'It is recommended to use HandleJobAsync instead. +Public Sub HandleJob(Job As HttpJob) As DBResult + Dim ser As B4XSerializator + Dim data() As Byte = Bit.InputStreamToBytes(Job.GetInputStream) + Dim res As DBResult = ser.ConvertBytesToObject(data) + res.Tag = Job.Tag + Return res +End Sub +'Handles the Job result and raises the Result event when the data is ready. + +Public Sub HandleJobAsync(Job As HttpJob, EventName As String) + Dim ser As B4XSerializator + Dim data() As Byte = Bit.InputStreamToBytes(Job.GetInputStream) + ser.ConvertBytesToObjectAsync(data, "ser") + Wait For (ser) ser_BytesToObject (Success As Boolean, NewObject As Object) + If Success = False Then + Log("Error reading response: " & LastException) + Return + End If + Dim res As DBResult = NewObject + res.Tag = Job.Tag + CallSubDelayed2(mTarget, EventName & "_result", res) +End Sub + + + + +'Reads a file and returns the file as a bytes array. +Public Sub FileToBytes(Dir As String, FileName As String) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Dim In As InputStream = File.OpenInput(Dir, FileName) + File.Copy2(In, out) + out.Close + Return out.ToBytesArray +End Sub +#if Not(B4J) +'Converts an image to a bytes array (for BLOB fields). +Public Sub ImageToBytes(Image As Bitmap) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Image.WriteToStream(out, 100, "JPEG") + out.Close + Return out.ToBytesArray +End Sub +'Converts a bytes array to an image (for BLOB fields). +Public Sub BytesToImage(bytes() As Byte) As Bitmap + Dim In As InputStream + In.InitializeFromBytesArray(bytes, 0, bytes.Length) + Dim bmp As Bitmap + bmp.Initialize2(In) + Return bmp +End Sub +#End If + +'Prints the table to the logs. +Public Sub PrintTable(Table As DBResult) + Log("Tag: " & Table.Tag & ", Columns: " & Table.Columns.Size & ", Rows: " & Table.Rows.Size) + Dim sb As StringBuilder + sb.Initialize + For Each col In Table.Columns.Keys + sb.Append(col).Append(TAB) + Next + Log(sb.ToString) + For Each row() As Object In Table.Rows + Dim sb As StringBuilder + sb.Initialize + For Each record As Object In row + sb.Append(record).Append(TAB) + Next + Log(sb.ToString) + Next +End Sub + + diff --git a/B4A/Files/add.png b/B4A/Files/add.png new file mode 100644 index 0000000000000000000000000000000000000000..0604bac84a9f8155d76b06fcf1b19405faa55cd4 GIT binary patch literal 4986 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 DL^2SG literal 0 HcmV?d00001 diff --git a/B4A/Files/chatbot6_191x191.png b/B4A/Files/chatbot6_191x191.png new file mode 100644 index 0000000000000000000000000000000000000000..b08a0fff7d0a7250090c74a74420e5080242ab7d GIT binary patch literal 11826 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 F&Og}ptS|ro literal 0 HcmV?d00001 diff --git a/B4A/Files/editaregla.bal b/B4A/Files/editaregla.bal new file mode 100644 index 0000000000000000000000000000000000000000..b8f078e9ec827aa6144448dbcf1072a873da5191 GIT binary patch literal 9085 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/floatbutton_layout.bal b/B4A/Files/floatbutton_layout.bal new file mode 100644 index 0000000000000000000000000000000000000000..118c9f1fb1d3e6af4c53ffc168bf91c072c67e0f GIT binary patch literal 1876 zcmah}&65*F6rZ@s>c}E~fZ`_ziVGXY-37n!17ec37DLbwcW+8(rjxWzW~OF33CoEp zFBWPQRa9ACy?gcG!ILMp_9iD!=wBc=Z}Io*$xH;d%Bgy<-$(cB_kQp7lq}2o6Z9~s z1bPTmakUyLz4a($CsQ_K5k)e71U7fH=7&P7p!dEGRvzcB>M+saU_;6AbRXl*j1NHL zS4bC&`W&b@)h}Z`^fm9M?NV#JbL->956jz)ou%U&i%n;{y!c04K6z_jv$?ZgIv=mB zUOV^YFLO8UT3`Ki``5$U2d?jF-8}W%>dha1|8f5}-!7bJlo#~%%GJT%pRI%6e|PLt z#61g|2f0amE0WJas&z!7T&E@z)eB_oT##C1lChx^! zEIPhCwoCBZ)aO(~Ka4Z&DeQEzWB0n)4VQau2y!F?-4p})@BR?u?$Gxyxv`YN0yGu4 z{?L~a8NsCZAheN66zbunBM~bR=w*iT zWmmI(I*fRDtUTRk=)P3FzUINc2;6=cn;5Ccjc2}4UcwnzegSMZ_-7-t`&h9Zu9>xu z;t=Dgl}t|lZ>*&>Y)xqKL99I1nFb*?PebdR7LL3k29YlvchsFucSi@retjT%a!vV? z)davcfP2N0C@O3kzn;@Lj{t(P4t#;=Bs(Jb)nKQ??+zI%u{1EHF1vk zsJg;6VAkqul}{RN1{>wq?}JvYH{12rXB+iad%ap|q`!@8XU{>nGyR9yT=^fdvmZ&} z224za2FvC^8b8zK&GVDL{+?j9icHGpt;D2c5!+IM<(gQ8&Ul%L&57fKHv)&!xSoJu z;_Zh}DjWcxdlIbRf$>or;b10k#*F0|3Lxv*OrTQa-)Qc6GO9LThe`bqgu|fJ{9vH+^MvCB$fT5FG?`46G7DC#SO&BC#vD+o zV6b}?;xg^bWCa9_FIQG+IR%zinb&Q=Wi>fSr@5KO4crX)8fd{_&er7Bybh&gy#a2& z36}TbEm|1h49N5%$Ng=(-T`};!h2vj+-bk^#>^T=m`nf)#?LEF0TfJ0gvmrQctPQm I-_I=TALcE0HUIzs literal 0 HcmV?d00001 diff --git a/B4A/Files/imagenes.bal b/B4A/Files/imagenes.bal new file mode 100644 index 0000000000000000000000000000000000000000..f53430e65b7eb1de2b252c056559e7aaa7be49bc GIT binary patch literal 3389 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 CvZOr# literal 0 HcmV?d00001 diff --git a/B4A/Files/mainpage.bal b/B4A/Files/mainpage.bal new file mode 100644 index 0000000000000000000000000000000000000000..44f2ac7ab0cb2c8c2f9311ada71bae7f1a107969 GIT binary patch literal 9428 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/page3.bal b/B4A/Files/page3.bal new file mode 100644 index 0000000000000000000000000000000000000000..28eeca3344e20d611741a2b3ab22be1bc4d7e98d GIT binary patch literal 2472 zcmc&!&u<%55MC2IV46}2EtK-3EwsUHU6Z8zEI%682_oP+;8=~s0eIPcjvuUdt=(sb z^c2Je6_6?wAub%abLGH+6PGs1t(-W)UqHEWGv7DswF&hJRbr(#`@NZY^Jc!8-JIh% zhck|IFWz~qd$7u`H9ccD?*}fWo7G5lIy$0#%?1@;tLQ%3FLbR9gMoDtnnXbazZGqX z-d2J3XZO-y;J`hXnz8_Vkcd2YK~7*%Pp1?!*4S!bobv2){{!du1d z>dxttmkPDgcCqk#R6KKIU#+&YlzTIpo!grK^rwlde>$K2@XOCfw+~*~Q@?ih=G?XK ze*ONy7hg`Dsurj0mGb5G-XEPq-+Vp&9^zN9c&{5bHaq$;poKLR8@IHeW3wLUsB}?V zmD0qFE&RrDw;whYn6|Pe3>LbPyqUZgsSUN}>*+DU7Y4RcCG^86-8~G?QhIE+iF~>A zWjl3G2ezi#n%AT`ve(V7@2|L#*1;5ZCUE_(ryIul;`yQKDOSsB0-R?39Tg!KfONyE zbzWq7g7E}MitJC%#0K^7(w>Tp3hWF+`MPP@N*i`~c*A(M#n3Hn)?1bbTPko{VI(mU zNXK&@887B+%sc`yj((Y{+vaO_jCaalLfWdatx6c7i*ah$gF|a!(L)urfTt)4ln_JQcdM*ruh0OMF#8*^Vx^pAfHQ%^~O@ATqWak>_ze~l9E38 zHu=qLou3EzE!jAEzWLwD(}{^>u0q8msc`a)B6b$UoF@CX{_5lHWSMTBxiGz)!x_nC zNQA^gL!2gj^j@y4^6ekDV5@npf E0gOPC8~^|S literal 0 HcmV?d00001 diff --git a/B4A/Files/reglas.bal b/B4A/Files/reglas.bal new file mode 100644 index 0000000000000000000000000000000000000000..db1655b6dc3727bb87d5c15c19b9d42bbfb75f33 GIT binary patch literal 9718 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 z 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 FV1f|bVUhp< literal 0 HcmV?d00001 diff --git a/B4A/Files/robot4_191x191.png b/B4A/Files/robot4_191x191.png new file mode 100644 index 0000000000000000000000000000000000000000..61ff5556b89ffde534912fc7399a08a2ce1e8146 GIT binary patch literal 22305 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 N<+9}^g3-+f{|{`l7U%!~ literal 0 HcmV?d00001 diff --git a/B4A/Files/robot8_191x191.png b/B4A/Files/robot8_191x191.png new file mode 100644 index 0000000000000000000000000000000000000000..8070accd3f1a09a6f8d0dabd43164a779c506c09 GIT binary patch literal 6645 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 literal 0 HcmV?d00001 diff --git a/B4A/Files/robotic_191x191.png b/B4A/Files/robotic_191x191.png new file mode 100644 index 0000000000000000000000000000000000000000..4d2fae772fc010b2d0e0ccccd2fc598adeb7cba5 GIT binary patch literal 7580 zcmV;N9b@8&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D9WhBnK~#8N?cE97 zb?aEiam}MrNwXm-6i!GTLWYPqA_50!zY}tvMD|>bb9F9 zLst%cUFcIo{}nnn^hcrRh0YHBPpDGac?>X@4!t(?FQNZ!(SL_t5prQvDm%~3LVpv= zjJ>3fg>D|IRCbozhfHBI1MkvDLw5;PDm%wDLmvrchTT{H8M02ORCb0h4!tIn8T3%S zBlOv!N@XXwQK)UY^KYRyg~*F| z?hcg^vFlhF7bAb^do|B*<8?V^NKNeC*Pea7SpP8u$jO#y>tE2>r+6 z;VFE}(a#d4^?(cNgNuii%DnmWP&Rk}*U-g78DA5!AkJR*m!VG&RVuURsiDk>$%P@Z z(>$K65v~*Z!%+5odP1mD*$FNd;-1V5nM`B;EcE)&pC0|5J&*o5Bm}xr*%^Kzlo|6- zJu_5&{FR;JvqEnTWd_|>UjJ30N@eHxvd|xdGQ;lDTSAgxDwUn(b3!i+wax37<$2E! zeNm`V*?D+%&Ir9cREprVust&*BGd&_sq7s*JelzeeGuVU*${Pyck{^3%5X<8<*96l zYW$Uhr5b*t?@>>9r>#Itnp9J=vK8ozucPb6=28AUD8X z!*7OO87jG6D|?6w{_{c)2q`17ZaKky&^tr-3E6?J8~`^AiJ{Mo;ZXIikn)O^J;hx6 zv7wKLG6Ohtng0B2NGNt?kNEP?uZ6OcUUjmb8~U`+-g5{GUfvoZ!q-3XTYo+rQdeI? z2}PqA#;(9KCE?vDu4wKTgod2!-wAzN$mg!?D4!g9PH1&>%Ot1v#i3h;zBqvr%<16 zF{(^db`TX5+D18sFT?7>p+n^JLr)I14Gu1lno+icsGU@GxC3P06=|(h-Jd(ePlmD+Nzw&tLD-Y|%#c37+4tq{ z$q7)|5g2%OB8~c24OLF%3Zc^U=d94)u}|I&qdE8FH-s!?v(NUD&`lN(2jRH<c=z9|1^Rm$OPW*NJ6}>z@e? ziB0nUUl6)zs1NRLeR~K0eMl^jyG~_8I6;pO4Q=rJyP+<){;Ua(6ZPp%VCpp%rdX;p zzd4lsy*^^7*9!GvXn94=_iPf@JHfl&$s z*>P9p{q$Y?{8h-YOWZM(y{@kW2y#MHM!+1ut!2-$cqB?wqVErt_>oZdnno70zZCk; zkbbxt$C)C%C}i&-drhNThSuRWp|+&YxK##HV- zEB{uKeU{ooYy^HWlzqXC8h0ZDW&ov8`L>}9qaYVv_8PMD`Awk`mkCJ&%w9|WPtNcV z=<^OASP+v^VvSZLALm7RHzrl1%UxDoTuS8cHRfEd(5PN| ze@_gV?i?3)jnb|!zx9xUPA)nX(K3eaf@VgBcZ7s$_r>5*+T8Ou#t7?vZRmlEho|7; zE8StX&RmUOO5rsY4^P43*0wrhJ1$LW4$2#g!@U3-2;vkx%@ugUP)1;>qn zCfR)a8DgHs`a7dCSL5fkk!F`6o`wBu!9$bL z_SuKxSfwuUF0xrpedcQXmkVX{QFBO9g=1k_W7ji7?au5yln_#_?q|jaj(+x~bk`9x zG$gCaw1ej;!$Nf|Q+`2dO1KQKkmU2ybL~!#P3in7|3157xN|lBl5e=Q zpgaz0;+q0w2u%C+5aTW(j^%kF>y!+4D!a8q_`Q%i`Wc)7JS?RV9bXZWk5IZx_#V$( zJRB9He+D=3>}+k0#*dOmqb(q7T`Wdbb0}daR3_I?guXIl&Mo}Fw1|uErJ=S8$IlK8 zo%4%cee~jCiZzkAdz)u20`JLUTdg8dndC=FUo{8Oa^7i6iZY}c*2 zZIkQvp%SJDE`scJ%Q6*dx}B7EbC+fA-e-!E;dLS;v*Rwy`><%IKJUpLrQ`v^&`qvo z?2Tlvbv}nU4>rOaM}8-;G;yo^=QtBD~%8B2`M-W?SpQE$^R!OjkEKOe?7Any;?YTp!3x4r4LT$lX zU9zJppsZ^Y9)dWhKGU+2+}Y#@^jR~lGwpF)iSpU&+{p#NRR&NBII~bI6_-7(@i$mR zzC2_TEIU>vnN-#!eL|qu!D3dTO6l`ua>tMjrhH>x)-irNxTWu^6hK#LK^g7r%OoC_ zj5g!{zR(cd1(fKP!BtA3v_^P;h|!DLmkv24jEJF0@Ud{s7PyR%cZrME&g#&(nxV$8 zR7+b5=>0>pWX@M4->_XsKI;te^8(zKVf=Q1v&|-HjC|kgU@>ViXQz_SpV2V}Ms`kU ziUnjB7MQA8@cTDaQB~Yvc}WGq7?DEFgXH*%#c%v_l+=K(3PUw^eVboJYy{xo?f+T*4O8*>f6M3*8`8 z83EIuu5uh*s>a`slJWNyuNP;6bl10??ZT>0X|%GL(iZe4&`ccrx`n6}Z6OZh;(mnU8h3mdu!F0oALnkR+LUhD*Izswj8Shjf^?3!_-!ziN)&d%U0IsinD*=y`>$n*UC&#&n7#Gq##snm~b*ekK0-e-8)p-5qNf*LP?o^DpXlu^UelfY1HT6 zFV!He%oGXe*~ug>yZePIizJ`6&AU?R@yd)*fuXBuwG(@s4WV5|R@Os9ZDm?4qDy}N z%FIzqGdrov;uaK&JIn4NBg3Pk(VyH1^+($hg#4fB&^~$u4+8U9!Cu+PU6sHv!CHdk zxJ&otr28B;_ihw=T&NWOu`0>wWAyBrEps@*7E@OUDZ#;iZp0Cs##gTr@o|02rZxQ6 zr5;};tP8}cn-- ztL)0I`KUN4YQ69u^CpyH@)@8;4Nipc<#jRgy*`xvjjEHSKB($&>*8*qSAiNy2C!^R zVSz1BQ0VkQl`>RlNrdIl@Zgt(O6BtUpvaS4;Oy8{3z_P;1FwtXUXKk8sVmA3o)Ib) zx!ns)v9$U>PQg_%HbbW`tBA`tB4x)vRGDU~fY+yxZ3)wxu3A2AQpWtW&|Y%mkZ|Md zgAb8u(s92eqs)(oghBL8gWN~?F2(O(Jan8OM{z%W7t(EV5tiCJ?JTA`V~)0rR)WcK zQPcCgLcbN7dzRLivY-{RFr<2O3C-s8Q^@|#I&$}zst3bKY{J`PM0s6E^MW=QU*lac zx9?iuDpOc0kh%`m1iVgq-CBh4Joz{Ne+eSHW^TW+!D6Csc?mS7YgKIWZPIjM-zZPKz%7c73#rEG144{r=+N z=(uRjfq5_d+_l^X(>Vi5a}i8|j4>BfRuvoW_Kyg;vl`f(TdrsAmV}3!E|oA?PSG)P zV~Cz?ixzxysMNI_mk#msXRjsm)ynpe;FFyfdUdGHWop`LmpOYaP0=TKqsV*ZtIs~1 z#f{dUU5L?5^JpfH1Loah`6hH%3d7GVuMV#?h@+D-9oF!Xmr!iWK2Eh*SPs1i-#w{ z6)ncDcD7`pS~;Ysj3_=0!=`e4z^1tubKC`J$qzsfLp+tyj+ z8+`Os=o`1=B6Fc+jty%Hn{SgawFjegart5yWnVnsEp{Ee2i4rFhG|{f@VX&`su8~w zG&re!PHp^xmooU!ha{1>HJ03Im3d(yJR}Co!nky9O9jYAVQS+ym&@>B6`1Xd0>N zk0b{5i4Jvc?KWq};Oab1gz45XS3fh9eK=A^q;vt8H%fF-ayxr1sZQpOV1Z?{k&~+9 zIImCk{Hpb25i28(=gyA3m>|vv8&TQwi6^hLgWKoaYN9=9mzN<6lXcORPbGyCM)k*s zgf|FT2DjR^LiY__*gqs#B)Mg(!nTUI{aY>`o`lV^r-e!jtV4&-J@dL4WNx>3coJ6% z$+jyYq(PJFXN63Gd4QJBZK=UH`1p5zmlsC(?CM^YIy@(Je5St0AMb^8K9fSXWf4wAiv2S6}d78F&I zQN^vdZ&iU^pZ3ThxJ~Gskio*8bLv*A>rQ)?aiL0rACeX4+&(|l7Tdp9Sg5LVFXp?g zpsfB<3|Z-tA<5OdZv5(Jt~T4YUvk~hRE%N#4I)1+gg+k2jz>H{yg;IHhn(BJ;)bE@ z%ONhYb=YO&|K1S8$lgC=nTj!uzrk7{J07ijZbxI2bN&)-i{L|w#x(kw^FApgcQ~Uh zrE`w7oxiQ0+c_A2Wr0!h=R~LX1o8%i-(mlsK&oteE-)D zsa{cvaWX%)c;xM=NjW1@jeombHT2w2TW*65pC1m{`K*jcHU90v9jI++TZICfN7e#% zQ7a=;jek3ch7>6&A-setcif&e`F=1vySeMF#RO8973RL6Y42o{?(YIwTy*s4RncUdQ z2B^kAJ)#wr_HzN0P^I9Ekl3TjhN#9rEfVWr5Ney_3s*MPdDn^GDjTC3|8y|;r-s@_ ze90fm@zt!fEl`br8W_HY*0P)0kk~I@RYBj9?jMraQj2!&A$B@fW4#+)J+uznjOS;h z`U`hepBO5;ykqpxDltVo{}ktTH0sDdK5EyC*%`Ygl1(u^ZZ}bD=^&`aKR#;NPlYy3 zyOz*0TdMJoi&0sP$*Bp?0@e7(#axz$$Ir2`h7bih<;8VSRO26?*N4=Z6r*F5 zR-&a#eJ&O$j@o)wMxq-3G}zJA$hzs_+a_ffyAo9#@2;Ub-E z8aAteQyGzM8@~|Wn=c-w+$kg)av$A$QWwqPbvrC^Zb&;<)vI?2=SzVt$v7qU`P>$9 z!KuKe-e$Am(IuNxiX8R5Sm$1}O6^UCpS{OMI?m{OyD7%l}v*ToXQ)tM! z-C5M6d32~xjrLV3*Z0$*J|o4Pjo%Ki@aF9OHTpovM%gAguJLOr`h*a7Y<7$`4LP?v ziIXmwBm3|}WW?+mCFW}UPVR$4jfW@G$3iMmZ<^y6zj{MrnX=aok?uTucL(sr%3IAo z@H%4Lj#*-^#&6+TYS2d-c>HK+8zbPl#?ParGIRF2b;M5E&h5@|$B+>%`>^ZChR+>B zCFW-Q=E4^CtCg3Rr8un!&TWl+>l(if`)!|VsGM6>s`mmptGpH22W|A8&?7^)5BcEM z1*I01jm#}eRnF#S{MQJnv!A`EMq2G}^RBdx@k`6pXDfS6BZ>IVt@ElPg>zeKE!(K= z-0l>j9J3EdeAo91Ww$xE)BA+l+KS#Ulrbmc=dlrvoV}k$>U3_q`^q}T@B7c5PtKc; zi_YUJnvi>K+Z0eP!%oAOEk8B;a29>H4t1dgW~qUN6u_)?eaZN_S2t<=I+eUFl)V>n zi&uGh4v8v5jb9&L8EDz_om&YwUAWVi&aJf0xwm6#<%*$FiyF82z6-mThO%QYo-Dyb z98C87w}!I2%oLdJX}^@ck4CQzwH2@0Bu41BhqCvXRfo1YSMplvG0=DIQaZPEnb2fR zy}0rPS?sN1fn;0X2ke7L$qW~dUBXo?9y4_G-o%1ZxPl8%1?Cd&LPkeE{W;)!DfI@( zB1xUw?7QT#a&8SweR$N-&y4Kcj>go6P#V=Nl7% zM%#0zHh%Fe+?pj5)R!x@gF>FvI&^WfSLiQv00R__u}X#-%T` zt$@@R=pvrs)_#xB8&3Q-KT1J#7Pb8Hd&j;S|9e9gUKvw2JAPq^!7O9iaPN@VrqcV` zHb(vo{`xtsO-5s1jo+qHX&!l%qn}g3SAOG=!n5u^_9E^UDtWBtfT^S6Ss5P;mF{Lc z&AuAH(W=zgL06QvcAsPL@{no71w;Pc5V!6&;4xDcB}1c(y<}?R|H#qLRgB83Q-d~m z1WMC|(%&e}t!+MCWbtrvyf>bzA)j>{nDUhR21rcFD1GlkKd*tRl$%`o8>29_@!P@7 zz6jYnL%txp#F>XgY>?hn8J?ewwmdPWC6)8IVJO@AHt4*1@$eK%=eG3kC7h#IEgqhP zi^8#X7KWzWh7Z_CGv&5MY$Z$~1g15|;Y$`FSen9kK9}e6-)>|u+Z}JH+61DVN*#HmkeDtWLNi`P-zpY3-4EYpZ1*s<^(_avPy`p$wCa=F~q9~ zGd^_edx*);cy_2OKy6#+w$g#h2hC_wHC&s{Bd&~y?Qw3p?8H{JODOiHB4D?|zPdUa zOlu^(SB9fW_Fh+r+jrxKgyKZ_zz7XT=b2Z}2FD0>5_8hsjnNciD4(pU%)u(`0 z$F6qvc^b)SxO}K`z^Ejg8OO5h0QV`px^2|kyk$uKa`rhIsl%gedgZ`T$m)Ti%t)4H zVQBumPNvc(xL8Pq2tj<=`)|avV>i1}`F|cC%8X@IYEde!Jr{UsZX43bI(xs%@|>H6 z4kfImG620{yGG7NuL<2Kw5`ZkuGkxdUKuKtfnV19LfV8@Dk(-p1|r8dGoV$O3fVO^ z&)$?<)JT8R&{?6r7pjfB%Y`bHPBgqIb(AT|BJ(jJ3&~Q!*LAT&d(Dv2=l+g3r0hMc zN|^T3Lz9;JuIwK|93CFZjH*ivRCf|B7QoYSApenCHb^g0b67BYnJ-4qUf3z4`yk zLMlSY!E`9Uc~&VqHCgHz_qt&kmgt+LvIw%8WUG zNLTrDLzzKtLOfDB8S?yO?N}?7NwJ8%TFB0-Sed@A$91LOm0+|7gh~zJDm|%l!|`x8 z(D;I@Q*wAypZ_@Dv8YpvV+CW4@+wlRt}too?n9v(|8(%&Tq?xXdGV0MaD4&91_?m3 yh;CZ*Gv*H;iE)d_)PB|4g2%?cS4QQ0=lefx6V@n>n%H>&0000h)N6rMHNz$$`2{D^-E(`s8rfJ6?(6k5f-GH_lEs^((s^QH%0=YXFj5&I_tehBh`H7rP6TO251NKzeu2_Zs zis#u@&20NXN#)P?+ZSqMx(!s6m6vnWq^V1YRKf7F>Vj8i8>kpAu#Iz}nJbzqU(z3j z+@01Zlv!I9g+j)w#7ew#wdn`S_0|vKv^H~|;k5-qoa@Rtr(!BsoS)LI2In$H>D#+@jCN+aZ*_J4>U6z$b6qBLdoX&!+3@YA zkAAzh@%Nc)#p{zFcK)<;{OYHp@%Y8Q_r7kq@|X7hmp^{fUhG`I=~~C+b=5KO-RC1c z`{JMUeAe^*j<(IE^EaZ}m9H-U>>^qYjVH~!*_pC>8d7pXca3~^Qn|*YrJU{|<>>*b zh?57qg_y?k>6S62dxmW#D~^15q=KVQ>l3ExSipI*HV0OkwiApt!LmD8);Ps1aS= zN$UN9=IfNZL&V<+~O*UgsP#l^SkDy?1Gez6-64T1H{iJf} z8t*D@q-Z;Nm9#C%NGV~0o>Ryfp--odX8A1{mPb>5<$N3%R=MH@`Oc=svqTa!RY;vV zn71vLnJnwBI}Ko%ZWo6!Robu=^W%Cmrf?)PJTjC>GmeMqN7wvH9D3lzDC&7dM3Ska ziL>b}omIn~vN8;$GTGEfZZtKL9USnTO`}pX{k_fb3koqW(9+5`_ohtKC=)wwI5V6{ zQ5il30*ou3Re{mtvZhw%NR4spY$l_!dgzN1I&*E<>(-@5Ii`H`NzjsS(%4wxo($a z(^Ate9_fSdi$Bm}{Bk?7;5CR`fr{R#&|*BC%yat;(>D9(-?R8?t=wpgiRS*I@C|;~@v9%Q;{$@PVNq^E8#%Ss)_2 z;VHxu1^(R$Oeb`li|s&Hcb=UX?xLRA>O#YT`w}lgh-%%`zl5&wz%N77!znIdU6ypl zso9NAuwWFyf`{J2DH;nXj5r4hA=--;)%LNE>_;CvfG$MpAT?Zl2u(r>c65B0Q{2ug z6kbKwh^CL$7tkL;t0&ty#^Q#V5ljh=VA>9$5mPASkF`Z>?L+62Edfa|?T4@^*)YEq zP5A4R4Hrtt2Ce+H4&W0@qN__z3d1{-^LC<1T8_e)E$U~0duoyax^2vWV6WX3d)$yE zV;>PzFC)|(ld;}+0IiQY@2j9rK~N_~VHP3F&sDAU7$hI{W=uW~i#x$uUM4eQBaU@U zzB`(rz>?8i0+UILdt>roi0KJP!sL?>mV?P@_?@2|Ve$~B8Vd|FELDWNX~JPTY{b5f z!x>CAs~?vxU21~*Fjj@ktEM#+aUu5Td^#{+q4?3Z5Ens)S$`Vf2j{n@=l0(F9ZRG50k{^UKb 25 Then 'Regeneramos la notificación permanente despues de 25 notificaciones varias. + Service.StartForeground(747, CreateNotification(status)) + cont = 0 + End If + cont = cont + 1 + If Not(notisMap2.IsInitialized) Then notisMap2.Initialize + If notisMap2.Size = 0 And Starter.notisMap2.IsInitialized Then +' If starter.Logger Then Log($"nsNotisMap2.size=${notisMap2.Size}, Starter.notisMap2=${Starter.notisMap2.size}"$) + notisMap2.Initialize + notisMap2 = Starter.notisMap2 +' If starter.Logger Then LogColor("Copie notisMap2 desde Starter.notisMap2, tamaño=" & notisMap2.Size, Colors.Green) + End If + If Not(nsStatus.IsInitialized) Then nsStatus.Initialize + If Starter.nsStatus.IsInitialized Then nsStatus = Starter.nsStatus + If Starter.starterStatus.IsInitialized Then + starterStatus.Initialize + starterStatus = Starter.starterStatus + Else If Not(Starter.starterStatus.IsInitialized) And starterStatus.IsInitialized Then + Starter.starterStatus.Initialize + Starter.starterStatus = nsStatus + Else + starterStatus.Initialize + Starter.starterStatus.Initialize + starterStatus.Put(Subs.fechaKMT(DateTime.now),"inicia") + Starter.starterStatus.Put(Subs.fechaKMT(DateTime.now),"inicia") + End If +' If starter.Logger Then Log($"starterStatus=${Starter.starterStatus}, nsStatus=${nsStatus}"$) + If rp.HandleIntent(StartingIntent) Then Return + + cmd.Initialize + cmd.Name = "select_soporte" 'Intentamos conectarnos al servido publico y si no responde cambiamos al interno. + reqManager.ExecuteQuery(cmd , 0, "pruebaConexion", 750) 'request con timeout corto en ms. + DBRChecked = False + Do While Not(DBRChecked) ' Esperamos a que termine la prueba de conexion. + Sleep(20) + Loop + End If +End Sub + +Sub CreateNotification (Body As String) As Notification + Dim notification As Notification + notification.Initialize2(notification.IMPORTANCE_LOW) + notification.Icon = "icon" + notification.SetInfo("Esperando notificaciones.", Body, Main) + Return notification +End Sub + +Sub Service_Destroy + nsStatus.Put(Subs.fechaKMT(DateTime.now),"termina") + If Starter.notisMap2.IsInitialized Then + Starter.notisMap2 = notisMap2 + Else + Starter.notisMap2.Initialize + Starter.notisMap2 = notisMap2 + End If + If Starter.logger Then LogColor("NotificationService Destroyed, copied notimap2 to starter=" & Starter.notisMap2.Size , Colors.Red) +End Sub + +Sub Bow2_NotificationPosted (SBN As StatusBarNotification) + If status = "Servicio Activo" Then + If Starter.logger Then LogColor(SBN.PackageName, Colors.Red) + '==============================================================================================================' + '============================================== Inicia Whatsapp =============================================' + '==============================================================================================================' + If SBN.PackageName = "com.whatsapp" Or SBN.PackageName = "com.whatsapp.w4b" Then + #Region Variables de la notificación +' If starter.Logger Then LogColor("ObjetoNoti:"&SBN,Colors.Blue) +' If starter.Logger Then Log(SBN.Id) 'get Id Notification +' If starter.Logger Then Log("PackageName:" & SBN.PackageName) 'get PackageName Application posted Notification +' If starter.Logger Then LogColor("NotiObject:"&SBN.Notification, Colors.Blue) 'get Notification object +' If starter.Logger Then LogColor("NotiExtras:"&SBN.Extras, Colors.Blue) 'get extras Notification +' If starter.Logger Then Log("NotiIntent:"&SBN.ContentIntent) 'get ContentIntent not used +' If starter.Logger Then Log("NotiKey:"&SBN.Key) 'get Key +' If starter.Logger Then Log("Title:" & SBN.Title) +' If starter.Logger Then Log("Mensaje:"&SBN.Message) +' If starter.Logger Then Log("Ticker:" & SBN.TickerText) +' If starter.Logger Then Log("Numero:" & getNumberWA(SBN)) +' If starter.Logger Then Log("Nombre persona:" & getPersonFromGroup(SBN.Title)) + #end region + If SBN.PackageName == "com.whatsapp" Or SBN.PackageName = "com.whatsapp.w4b" Then + If Starter.logger Then Log("Llega WA Notificacion = " & SBN.Title & " - " & SBN.Message) + Dim whatsappkey As String = SBN.Key + If Starter.logger Then Log(SBN.key) + Dim ww() As String = Regex.Split("\|", whatsappkey) + If ww(3) <> "null" Then + Subs.guardaNotificacion(SBN)'Aqui guardamos en un mapa las notificaciones y posteriormente poder mandar notificacion a esos números. +' Starter.colaNotifs.ExecNonQuery($"insert into cola (numero, contestada, timestamp) values ('${getNumberWA(SBN)}', 0, ${DateTime.Now})"$) +' If starter.Logger Then Log(notisMap2) +' If starter.Logger Then Log(notificacionesPorContestar) + #Region Grupo o persona +' If starter.Logger Then LogColor("isGroupWA: "&isGroupWA2(SBN.Title),Colors.Magenta) +' If starter.Logger Then LogColor("isGroupWA2: "&isGroupWA(SBN),Colors.Magenta) +' If starter.Logger Then LogColor("isPersonWA: "&isPersonWA(SBN),Colors.Magenta) +' If starter.Logger Then LogColor("isPersonWA2 :"&isPersonWA2(SBN),Colors.Magenta) +' If starter.Logger Then LogColor("getPersonFromGroup: "& getPersonFromGroup(SBN.Title) ,Colors.Magenta) +' If starter.Logger Then LogColor("groupName: "& getGroupName(SBN.Title) ,Colors.Magenta) +' If starter.Logger Then LogColor("groupName2: "& getGroupName2(SBN) ,Colors.Magenta) +' If starter.Logger Then LogColor("getNumberOrGroupWA: "& getNumberOrGroupWA(SBN) ,Colors.Magenta) +' If starter.Logger Then LogColor("getNumberWA: "& getNumberWA(SBN) ,Colors.Magenta) +' If starter.Logger Then LogColor("getShortcut: "& getShortcut(SBN) ,Colors.Magenta) +' If starter.Logger Then LogColor("mapReglas="&mapReglas, Colors.Magenta) + #End Region + Try 'A veces el sistema finaliza la aplicación, el servicio continua interceptando notificaciones, pero la lista de notificaciones recibidas ya no se actualiza. + CallSubDelayed(B4XPages.MainPage, "llenaLV") 'Poblamos el listview con las notificaciones recibidas. + Catch + LogColor(LastException, Colors.red) + End Try + End If + procesaColaDeNotificaciones + End If + #Region Codigo para Whatsapp Bussiness - Deshabilitado +' If SBN.PackageName == "com.whatsapp.w4b" Then +' Dim whatsappkey As String = SBN.Key +' Dim ww() As String = Regex.Split("\|", whatsappkey) +' If ww(3) <> "null" Then +' 'rp.ClearNotification(SBN) +' rp.reply(SBN.Notification, SBN.PackageName, "Reply HelloWorld WhatsApp-Business") +' Log("Reply Whatsapp Success") +' End If +' End If + #end region + End If + End If +End Sub + +'Modo simple de regex que permite poner un * para significar cualquier cadena y // para significar OR. +Sub regexSimple(cadenaOriginal As String) As String + cadenaOriginal = Regex.Replace("\*", cadenaOriginal, "\.\*") + cadenaOriginal = Regex.Replace("\/\/", cadenaOriginal, "\|") +' If starter.Logger Then Log(cadenaOriginal) + Return cadenaOriginal +End Sub + +'Regresa "verdadero" si el el texto "aBuscar" existe en el texto "sbnMensaje", se pueden +'agregar * para significar cualquier cadena y // para significar OR. +'Ej. coincideRegexSimple("*hola*//*buenas*", "Hola, como estas") = verdadero +' coincideRegexSimple("*hola*//*buenas*", "Buenas tardes") = verdadero +Sub coincideRegexSimple(aBuscar As String, sbnMensaje As String) As Boolean +' If starter.Logger Then Log(sbnMensaje) + Private x As Boolean + Dim sbnMensaje As String = Regex.Replace("[\r?\n|\r]",sbnMensaje," ") 'Sustituimos los "retornos" por un espacio porque si tiene retornos el mensaje la busqueda no va a coinicidir. +' If starter.Logger Then Log($"|${aBuscar}|${sbnMensaje}|"$) + x = Regex.IsMatch2(regexSimple(aBuscar), Regex.CASE_INSENSITIVE, sbnMensaje) + If aBuscar = "%solo_numeros%" Then x = Regex.IsMatch("\d+", sbnMensaje) 'Solo acepta numeros en la respuesta. + If aBuscar = "%solo_correos%" Then x = Regex.IsMatch("([a-zA-Z0-9]+[_a-zA-Z0-9\.-]*[a-zA-Z0-9]+)@([a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*\.[a-zA-Z]{2,12})", sbnMensaje) 'Solo acepta direcciones de correo en la respuesta. + If aBuscar = "%solo_urls%" Then x = Regex.IsMatch("^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \?=.-]*)\/?$", sbnMensaje) 'Solo acepta URLs en la respuesta. + Return x +End Sub + +'Returns TRUE if the sender is a GROUP. +'Searches the provided sbn.title for the string ": " to know if the sender is a group. +Sub isGroupWA2(sbnTitle As String) As Boolean 'ignore + Private x As Boolean = Regex.ismatch(".*(: ).*", sbnTitle) + Return x +End Sub + +'Returns TRUE if the sender is a GROUP. +'Searches the provided notification object for the string "@g.us" and if found returns TRUE. +Sub isGroupWA(sbn As StatusBarNotification) As Boolean + Private a As Boolean = False + If sbn.As(String).IndexOf("@g.us") > -1 Then a = True 'ignore + Return a +End Sub + +'Returns TRUE if the sender is a PERSON. +'Searches the provided notification object for the string "@s.whatsapp.net" and if found returns TRUE. +Sub isPersonWA(sbn As StatusBarNotification) As Boolean 'ignore + Private a As Boolean = False + If sbn.As(String).IndexOf("@s.whatsapp.net") > -1 Then a = True 'ignore + Return a +End Sub + +'Returns TRUE if the sender is a PERSON. +'Searches the provided notification object for the string "channel=individual" and if found returns TRUE. +Sub isPersonWA2(sbn As StatusBarNotification) As Boolean 'ignore + Private a As Boolean = False + If sbn.As(String).IndexOf("channel=individual") > -1 Then a = True 'ignore + Return a +End Sub + +'Returns the sender's number. +'Searches the provided notification object and gets the numbers between "shortcut=" and "@s.whatsapp.net". +Sub getNumberWA(sbn As StatusBarNotification) As String + Private a As Int = sbn.As(String).IndexOf("@s.whatsapp.net") 'ignore + If a > -1 Then + Private x As String = sbn.As(String) 'ignore + Private y As Int = x.IndexOf("shortcut=") + If (y+9) > 0 And a > (y+9) Then x = x.SubString2(y+9, a) Else x = "Not a person" + Else 'It is probably is a group. + x = "Not a person" + End If + Return x +End Sub + +'Returns the name of the group from the given text. +'If it is not a group, then returns the notification's title. +Sub getGroupName(sbnTitle As String) As String 'ignore + Private a As Int = sbnTitle.IndexOf(": ") + Private x As String = sbnTitle + If a > -1 Then + Private b As String = sbnTitle.SubString2(0, a) + x = Regex.Replace(" \(.+\)", b, "") + End If + Return x +End Sub + +'Returns the name of the group from the given notification object. +'Searches the provided notification for the string "hiddenConversationTitle" and if found, gets the name. +'If it is not a group,then it returns the notification's title. +Sub getGroupName2(sbn As StatusBarNotification) As String + Private inicio As Int = sbn.Extras.As(String).IndexOf("hiddenConversationTitle=") 'ignore + If inicio > -1 And sbn.Extras.As(String).IndexOf("hiddenConversationTitle=null") = -1 Then 'ignore + Private x As String = sbn.Extras.As(String) 'ignore + Private fin As Int = x.IndexOf(", android.reduced.images=") + x = x.SubString2(inicio+24, fin) + x = Regex.Replace(" \(.+\)", x, "") 'Replace anything between () with "", this en the case that we have something like "MyGroupName (5 messages)" + Else 'Is not from a group. + Private x As String = sbn.Title + End If + Return x +End Sub + +'Returns the person's name (or the number) when the message comes from a group. +'Searches the provided sbn.title for the string ": " in the title and returns the string after that, +'if it does not find ": " then returns the complete string. +Sub getPersonFromGroup(sbnTitle As String) As String 'ignore + Private a As Int = sbnTitle.IndexOf(": ") + If a = -1 Then a = -2 'Is not from a group. + Private b As String = sbnTitle.SubString(a+2) + Return b +End Sub + +'Returns the NUMBER of the sender and if NOT a person, then returns the name of the group. +Sub getNumberOrGroupWA(sbn As StatusBarNotification) As String + Private numRemitente As String = getNumberWA(sbn) + If numRemitente = "Not a person" Then numRemitente = getGroupName(sbn.Title) + Return numRemitente +End Sub + +'Desbloquea el usuario de Guna especificado usando JRDC. +Sub desbloqueaUsuario(sbn As StatusBarNotification) 'ignore + Private elNumero As String = getNumberWA(sbn) + If elNumero = "Not a person" Then elNumero = getGroupName(sbn.Title) + agregaNotiParaJobDone(sbn) + cmd.Initialize + cmd.Name = "update_usuario_guna_nobajas" + Dim tempUsr As String = sbn.Message +' Dim tempUsr As String = "cdaza" + If Starter.logger Then LogColor("Usuario a desbloquear="&tempUsr, Colors.Green) + cmd.Parameters = Array As Object(tempUsr.ToUpperCase.Trim) 'Quitamos espacios de antes y despues y lo mandamos en mayúsculas. + reqManager.ExecuteCommand(cmd , $"desbloqueaUsuario_${elNumero}"$) + If Starter.logger Then Log("Mandamos DBRequest desbloqueo: " & tempUsr) +End Sub + +'Trae los datos del cliente especificado de Guna usando JRDC. +Sub revisaCliente(sbn As StatusBarNotification) 'ignore + Private elNumero As String = getNumberWA(sbn) +' If elNumero = "Not a person" Then elNumero = getGroupName(sbn.Title) + agregaNotiParaJobDone(sbn) + If Starter.logger Then Log("Buscamos cliente "&sbn.Message) + cmd.Initialize + cmd.Name = "select_cliente_GUNA" + Dim tempUsr As String = sbn.Message + If Starter.logger Then LogColor("Cliente="&tempUsr, Colors.Green) + cmd.Parameters = Array As Object(tempUsr.ToUpperCase.Trim) 'Quitamos espacios de antes y despues y lo mandamos en mayúsculas. + reqManager.ExecuteQuery(cmd, 0 , $"traeCliente_${elNumero}"$, 0) + If Starter.logger Then Log("Mandamos DBRequest traeCliente: " & tempUsr) +End Sub + +'Revisa si el cliente especificado existe en Guna. +Sub revisacliente2(sbn As StatusBarNotification) + Private elNumero As String = getNumberWA(sbn) + agregaNotiParaJobDone(sbn) + If Starter.Logger Then Log("Buscamos cliente "&sbn.Message) + cmd.Initialize + cmd.Name = "select_revisacliente_GUNA" + Dim tempUsr As String = sbn.Message + If Starter.logger Then LogColor("Cliente="&tempUsr, Colors.Green) + cmd.Parameters = Array As Object(tempUsr.ToUpperCase.Trim) 'Quitamos espacios de antes y despues y lo mandamos en mayúsculas. + reqManager.ExecuteQuery(cmd, 0 , $"revisaCliente_${elNumero}"$, 0) + If Starter.logger Then Log("Mandamos DBRequest revisaCliente: " & tempUsr) +End Sub + +'Guarda los datos de la promoción de la gallina en Guna. +Sub guardaInfoGallina(sbn As StatusBarNotification) + If Starter.logger Then LogColor("================= INFO GALLINA ============", Colors.Red) + Private elNumero As String = getNumberWA(sbn) + agregaNotiParaJobDone(sbn) + Dim preventa As String = sbn.Message +' If starter.Logger Then Log(procesaRemplazos($"%msj_ant_03G.1_0%|%msj_ant_03G.1.1_0%"$, traeNotificacion(elNumero))) + Private paramss() As String=Regex.Split("\|", procesaRemplazos($"%msj_ant_03G.1_0%|%msj_ant_03G.1.1_0%"$, traeNotificacion(elNumero))) + If Starter.logger Then LogColor($"${elNumero}, ${paramss(0)}, ${paramss(0)}, ${preventa}"$, Colors.green) + cmd.Initialize + cmd.Name = "insert_registroGallina_GUNA" + cmd.Parameters = Array As Object(elNumero, paramss(0), paramss(0), preventa) + reqManager.ExecuteCommand(cmd, $"guardaInfoGallina_${elNumero}"$) + If Starter.logger Then Log("Mandamos DBRequest guardaInfoGallina_: " & elNumero) +End Sub + +'Agregamos la notificacion a un mapa para una vez que tengamos el jobDone poder mandar un mensaje especificado. +Sub agregaNotiParaJobDone(sbn As StatusBarNotification) + Dim n As notificacionesGuardadasType + n.Initialize + n.numero = getNumberWA(sbn) + n.notif = sbn + Dim titulo As String = getNumberWA(sbn) + If isGroupWA(sbn) Then titulo = getGroupName2(sbn) + Private tmpMap As Map + tmpMap.Initialize + tmpMap.Put(titulo, n) + tmpMap.Put("msg", sbn.Message) + notificacionesGuardadas.Put(titulo, tmpMap) +' If starter.Logger Then Log($"Mapa notificacionesGuardadas=${notificacionesGuardadas}"$) +End Sub + +Sub JobDone(Job As HttpJob) 'ignore + If Starter.Logger Then LogColor("jobDone: " & Job.Tag, Colors.Magenta) + If Job.Success = False Then + If Starter.Logger Then LogColor("***** jobDone Error *****", Colors.Red) + If Starter.Logger Then LogColor(Job.ErrorMessage, Colors.Red) + If Job.Tag = "pruebaConexion" Then 'And Job.ErrorMessage.IndexOf("Failed to connect to ") = -1 + B4XPages.MainPage.Timer1.Interval = (20 * 1000) + Private cd1 As ColorDrawable + cd1.Initialize(Colors.red, 10dip) + B4XPages.MainPage.b_config.Background = cd1 + B4XPages.MainPage.b_config.text = "Desconectado" + If Starter.DBRServer == "http://10.0.0.205:1782" Then + Starter.DBRServer = "http://keymon.lat:1782" + Else + Starter.DBRServer = "http://10.0.0.205:1782" + End If +' DBRServer = "http://11.0.0.231:1783" 'Para pruebas locales + reqManager.Initialize(Me, Starter.DBRServer) + pruebaPaso = pruebaPaso + 1 +' Toast("Cambiando a servidor interno. 🕵🏼", 0) +' ToastMessageShow("Cambiando a servidor interno. 🕵🏼", False) + If Starter.logger Then Log($"PruebaPaso = ${pruebaPaso}"$) + If Starter.Logger Then LogColor("Reintentando conexion: " & Starter.DBRServer, Colors.RGB(255,123,0)) + ToastMessageShow("Reintentando conexion: " & Starter.DBRServer, False) + If pruebaPaso < 2 Then + If Starter.Logger Then Log("Reintentamos conexión con servidor nuevo.") + cmd.Initialize + cmd.Name = "select_soporte" 'Reintentamos conexión. + reqManager.ExecuteQuery(cmd , 0, "pruebaConexion", 0) + End If + If Starter.Logger Then LogColor("Servidor actual: " & Starter.DBRServer, Colors.Magenta) + End If + Else + If Starter.Logger Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027 + If Job.JobName = "DBRequest" Then 'Para desbloquear un usuario Guna. + Dim result As DBResult = reqManager.HandleJob(Job) + If Starter.logger Then Log("******************************************************") + If Starter.logger Then Log($"************ ${result.Tag} ***********"$) + If Starter.logger Then Log("******************************************************") + If result.Tag = "pruebaConexion" Then + If Starter.logger Then Log($"${Starter.ultimoServidorConectado}+${Starter.DBRServer} "$) + If Starter.logger Then LogColor("Servidor actual: " & Starter.DBRServer, Colors.Magenta) + If Starter.ultimoServidorConectado <> Starter.DBRServer Then + ToastMessageShow($"Conexión establecida${CRLF}${Starter.DBRServer}"$, False) + Else + ToastMessageShow($"OK"$, False) + End If + Starter.ultimoServidorConectado = Starter.DBRServer + Private cd1 As ColorDrawable + cd1.Initialize(Colors.RGB(109, 221, 101), 10dip) + B4XPages.MainPage.b_config.Background = cd1 + B4XPages.MainPage.b_config.text = "Conectado" + B4XPages.MainPage.Timer1.Interval = (120 * 1000) +' For Each records() As Object In result.Rows +' If starter.Logger Then Log("========================= ") +' For Each k As String In result.Columns.Keys +' If starter.Logger Then LogColor(result.Tag & ": " & k & "=" & records(result.Columns.Get(k)), Colors.blue) +' Next +' Next + End If + If result.Tag.As(String).IndexOf("desbloqueaUsuario_") > -1 Then 'query tag + For Each records() As Object In result.Rows + Private num As String = result.Tag + num = num.SubString(num.IndexOf("_")+1) + Private usr As String = notificacionesGuardadas.Get(num).As(Map).Get("msg") + If Starter.Logger Then Log("========================= "&usr) + If records(result.Columns.Get("AffectedRows")) > 0 Then + If Starter.Logger Then Log("Usuario desbloqueado! 🔓") + mandaRespuesta(num, $"Usuario *${usr.ToUpperCase}* desbloqueado, por favor cerrar navegadores y reingresar."$) + Else + If Starter.Logger Then Log("Usuario no encontrado!!") + mandaRespuesta(num, $"El usuario *${usr.ToUpperCase} no existe* o esta dado de *baja*, por favor revisarlo y volver a intentar."$) + End If +' If starter.Logger Then Log( result.Tag & " | " & num) +' If starter.Logger Then Log(Starter.desbloqueoUsrs) +' For Each k As String In result.Columns.Keys +' If starter.Logger Then Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k))) +' Next + Next + End If + If result.Tag.As(String).IndexOf("traeCliente_") > -1 Then 'query tag + Private num As String = result.Tag + num = num.SubString(num.IndexOf("_")+1) + If Starter.Logger Then Log(num) + For Each records() As Object In result.Rows + If Starter.Logger Then Log("========================= "&usr) + If Starter.Logger Then Log("Cliente encontrado!") + For Each k As String In result.Columns.Keys + If Starter.logger Then LogColor(result.Tag & ": " & k & ": " & records(result.Columns.Get(k)), Colors.blue) + Next + Private cod As String = records(result.Columns.Get("CAT_CL_CODIGO")) + Private nombre As String = records(result.Columns.Get("CAT_CL_NOMBRE")) + Private calle As String = records(result.Columns.Get("CAT_CL_CALLE")) + Private noInt As String = records(result.Columns.Get("CAT_CL_NOINT")) + Private noExt As String = records(result.Columns.Get("CAT_CL_NOEXT")) + Private msj As String = $"*Cliente:* ${cod}${CRLF}*Tienda:* ${nombre}${CRLF}*Calle:* ${calle}${CRLF}*No. Int:* ${noInt}${CRLF}*No. Ext:* ${noExt}"$ + mandaRespuesta(num, msj) + mandaRespuesta(num, "Por favor dame el nombre del encargado de la tienda.") + Next + If starter.Logger Then Log(result.Rows.Size) + If result.Rows.Size = 0 Then + If Starter.Logger Then Log("Cliente no encontrado!!") + mandaRespuesta(num, $"*No se encontró el cliente en nuestros registros*, por favor validar la información y volver a intentar."$) + End If + End If + If result.Tag.As(String).IndexOf("revisaCliente_") > -1 Then 'query tag + Private num As String = result.Tag + num = num.SubString(num.IndexOf("_")+1) + If Starter.Logger Then Log(num) + For Each records() As Object In result.Rows + If Starter.Logger Then Log("========================= "&usr) + For Each k As String In result.Columns.Keys + If Starter.logger Then LogColor(result.Tag & ": " & k & "=" & records(result.Columns.Get(k)), Colors.blue) + Next + Next + If records(result.Columns.Get("CUANTOS")) = "0" Then + If Starter.Logger Then Log("No existe el usuario") + mandaRespuesta(num, $"*No existe* ese número de cliente, por favor ingresa el número correcto."$) + Subs.vamosA(traeNotificacion(num), "03G") + Else + mandaRespuesta(num, "Gracias, ahora por favor el número del preventa.") +' Subs.vamosA(traeNotificacion(num), "03G.1") + End If + If Starter.Logger Then Log(result.Rows.Size) + End If + If result.Tag.As(String).IndexOf("guardaInfoGallina_") > -1 Then 'query tag + Private num As String = result.Tag + num = num.SubString(num.IndexOf("_")+1) + If Starter.Logger Then Log(num) + For Each records() As Object In result.Rows + If Starter.Logger Then Log("========================= "&usr) + For Each k As String In result.Columns.Keys + If Starter.logger Then LogColor(result.Tag & ": " & k & "=" & records(result.Columns.Get(k)), Colors.blue) + Next + Next +' If starter.Logger Then Log("|"&records(result.Columns.Get("AffectedRows"))&"|") + If records(result.Columns.Get("AffectedRows")) = 1 Then + Private msj As String = procesaRemplazos($"Muchas gracias.${CRLF}Quedas registrado con:${CRLF}*Cliente:* %msj_ant_03G.1_0%${CRLF}*Preventa:* %msj%"$, traeNotificacion(num)) + mandaRespuesta(num, msj) + Else + mandaRespuesta(num, "*¡Hubo un error, por favor intenta de nuevo!*") + End If + If Starter.Logger Then Log(result.Rows.Size) + End If + If result.Tag.As(String).IndexOf("procRecuperaClientes_") > -1 Then 'query tag + Private num As String = result.Tag + num = num.SubString(num.IndexOf("_")+1) + If Starter.Logger Then Log(num) + For Each records() As Object In result.Rows + If Starter.Logger Then Log("========================= "&usr) + For Each k As String In result.Columns.Keys + If Starter.logger Then LogColor(result.Tag & ": " & k & "=" & records(result.Columns.Get(k)), Colors.blue) + Next + Next + + If records(result.Columns.Get("AffectedRows")) = 1 Then + mandaRespuesta(num, procesaRemplazos("Listos, clientes de %msj% recuperados", traeNotificacion(num))) + End If +' If starter.Logger Then Log("|"&records(result.Columns.Get("AffectedRows"))&"|") +' If records(result.Columns.Get("AffectedRows")) = 1 Then +' Private msj As String = procesaRemplazos($"Muchas gracias.${CRLF}Quedas registrado con:${CRLF}*Cliente:* %msj_ant_03G.1_0%${CRLF}*Preventa:* %msj%"$, traeNotificacion(num)) +' mandaRespuesta(num, msj) +' Else +' mandaRespuesta(num, "*¡Hubo un error, por favor intenta de nuevo!*") +' End If + If Starter.Logger Then Log(result.Rows.Size) + End If + End If + Job.Release + End If +End Sub + +'Muestra un toast con texto y ancho dados, si el ancho es 0, entonces se queda el default. +Sub Toast(texto As String, ancho As Int) 'ignore +' p_toast.BringToFront +' If ancho <> 0 Then p_toast.Width = ancho +' p_toast.left = (Activity.Width/2)-(p_toast.Width/2) 'Centramos el panel en la actividad. +' l_toast.Width = p_toast.Width +' p_toast.top = (Activity.Height * 0.8) 'Ponemos el toast a 3/4 de la pantalla. +' l_toast.Text = texto +' p_toast.SetVisibleAnimated(1000, True) +' Sleep(2000) +' p_toast.SetVisibleAnimated(1000, False) +End Sub + +'Manda un notificacion al numero indicado con el mensaje especificado. +'Nota: El número especificado debe de existir en el mapa de notificaciones guardadas (notificacionesGuardadas). +Sub mandaRespuesta(numero As String, mensaje As String) + If Starter.logger Then Log("Busco: "& numero & " hay: " & notificacionesGuardadas) + If Starter.logger Then Log(notificacionesGuardadas) + Private tm As Map = notificacionesGuardadas.Get(numero) + If tm.IsInitialized Then + Dim t1 As notificacionesGuardadasType = tm.Get(numero) + Dim t2 As StatusBarNotification = t1.notif + If Starter.logger Then LogColor("Mandamos respuesta", Colors.red) + If t2.IsInitialized Then + rp.reply(t2.Notification, t2.PackageName, mensaje) + guardaMsjSalida(t2, mensaje) + End If + Else +' ToastMessageShow("No hay notificaciones de xxxxxxxx", False) + If Starter.logger Then Log("No hay notificación para ese número.") + End If +End Sub + +'Ejecuta la subrutina especificada. +Sub correSub(comando As String, sbn As StatusBarNotification) + Private c As String = comando + c = c.SubString(c.IndexOf(" ")+1) + If Starter.logger Then Log(c) + If SubExists(Me, c) Then CallSubDelayed2(Me, c, sbn) +End Sub + +Sub muestraHistorico(sbn As StatusBarNotification) 'ignore + If Starter.logger Then Log("Corriendo muestraHistorico") + Private tmpMap As Map + Private tmpList As List + Private n As String = getNumberWA(sbn) + If n = "Not a person" Then n = getGroupName(sbn.Title) + Private s As String = "" + If Starter.logger Then Log(n) + tmpMap = histReglas.Get(n) + If Starter.logger Then Log(tmpMap) + If tmpMap.ContainsKey("historico") Then tmpList = tmpMap.Get("historico") + For i = tmpList.Size -1 To 0 Step -1 +' If starter.Logger Then Log(i & ".- " & tmpList.Get(i).As(Map).Get("mensaje")) + s = s & CRLF + s = s & tmpList.Get(i).As(Map).Get("mensaje") + Next +' If starter.Logger Then Log(s) + mandaRespuesta(n, s) +End Sub + +'Regresa verdadero si la regla es dependiente (subRegla) de otra regla. +'Recibe un mapa con las reglas. +Sub esDependiente(m As Map)As Boolean + Private d As Boolean = False + If m.Get("nombre").As(String).IndexOf(".") > -1 Then d = True + Return d +End Sub + +'Regresa el nombre de la regla superior. +'Recibe un mapa con las reglas. +Sub traeSuperior(m As Map) As String + Dim i As Int + Dim s As String = "" + If m.Get("nombre").As(String).LastIndexOf(".") > -1 Then + i = m.Get("nombre").As(String).LastIndexOf(".") +' If starter.Logger Then Log(i) + s = m.Get("nombre").As(String).SubString2(0, i) +' If starter.Logger Then Log(s) + End If + Return s +End Sub + +'Regresa el id de la ultima regla cumplida. +Sub ultimaRegla As String + Dim ultReg As String = "" + If histReglas.get(numRemitente).As(Map).IsInitialized Then ultReg = histReglas.get(numRemitente).As(Map).Get("histReglas").As(List).Get(0) + Return ultReg +End Sub + +'Regresa el mensaje especificado dentro de las reglas anteriores cumplidas. +'regla: El nombre de la regla de la que queremos el mensaje. +'reglasAtras: Que mensaje queremos traer, 0 para el último, 1 para el penúltimo, 2 para el antepenúltimo, etc. +Sub mensajeAnterior(regla As String, reglasAtras As Int) As String + Dim msjAnterior As String = "" + If reglasAtras = 0 Then reglasAtras = 1 + If histReglas.get(numRemitente).As(Map).IsInitialized And _ + histReglas.get(numRemitente).As(Map).Get("historico").As(List).Size >= reglasAtras Then + Private hist As List = histReglas.get(numRemitente).As(Map).Get("historico") +' If starter.Logger Then Log(hist) + If regla <> "0" Then 'Si se especifica una regla, entonces filtramos y solo usamos el historico de esa regla. + Private h As List + h.Initialize + For Each h2 As Map In hist + If h2.Get("regla") = regla Then + h.Add(h2) +' If starter.Logger Then Log(regla & "|" & h2) + End If + Next + hist = h +' If starter.Logger Then Log(h) + End If +' If starter.Logger Then Log($"size:${hist.Size}, reglaAtras:${reglasAtras}"$) + If hist.Size >= reglasAtras Then msjAnterior = hist.Get(reglasAtras-1).As(Map).Get("mensaje") + End If + Return msjAnterior +End Sub + +'Regresa el "shortcut" del remitente. +'Si es de un grupo, es algo como "120363023512345678@g.us" +'Si es de una persona, entonces "5215512345678@s.whatsapp.net" +Sub getShortcut(sbn As StatusBarNotification) As String 'ignore + Private ap As Int = sbn.As(String).IndexOf("@s.whatsapp.net") 'ignore + Private ag As Int = sbn.As(String).IndexOf("@g.us") 'ignore + Private x As String = sbn.As(String) 'ignore + Private y As Int = x.IndexOf("shortcut=") + If ap > -1 Then + Private x As String = sbn.As(String) 'ignore + Private y As Int = x.IndexOf("shortcut=") + x = x.SubString2(y+9, ap+15) + Else if ag > -1 Then 'It is probably is a group. + Private x As String = sbn.As(String) 'ignore + Private y As Int = x.IndexOf("shortcut=") + x = x.SubString2(y+9, ag+5) + End If + Return x +End Sub + +'Reemplaza texto en la respuesta con variables predefinidas. +Sub procesaRemplazos(msjStr As String, sbn As StatusBarNotification) As String + If Starter.logger Then Log("Procesamos reemplazos '"& msjStr & "'") + Dim Matcher1 As Matcher + Matcher1 = Regex.Matcher("%[a-z A-Z_0-9,\.\uD83C-\uDBFF\uDC00-\uDFFF\u00a9|\u00ae|[\u2000-\u3300]|\ud83c[\ud000-\udfff]|\ud83d[\ud000-\udfff]|\ud83e[\ud000-\udfff]]+%", msjStr) + Do While Matcher1.Find + If Starter.logger Then Log("Found: " &Matcher1.Match) + If Matcher1.Match.IndexOf("msj_ant_") > -1 Then 'Reemplaza el texto "%msj_ant_0_1%" por mensajes anteriores segun el desplazamiento y la regla especificados. + Private offs As String = Matcher1.Match.IndexOf("_") + Dim offs2() As String = Regex.Split("_", Matcher1.Match) + If Starter.logger Then Log(offs2.Length) + If offs2.Length = 4 Then 'Solo procesamos el reemplazo si tiene 4 parametros. + Private offs As String = offs2(offs2.Length-1) 'El desplazamiento para el mensaje (cuantos mensaje hacia atras vamos a traer) + Private rulz As String = offs2(offs2.Length-2) 'La regla a usar para traer el mensaje. + offs = offs.SubString2(0, offs.Length-1) + If Starter.logger Then Log("################### "& rulz & "|" & offs) + msjStr = msjStr.Replace(Matcher1.Match, mensajeAnterior(rulz, offs)) +' If starter.Logger Then Log(Matcher1.Match) +' If starter.Logger Then Log("==== msjAnt - " & msjStr) + End If + else If Matcher1.Match.IndexOf("%msj%") > -1 Then 'Reemplaza el texto "%msj%" con el mensaje recibido. + msjStr = msjStr.Replace(Matcher1.Match, sbn.Message) + else if Matcher1.Match.IndexOf("%nombre%") > -1 Then 'Reemplaza el texto "%nombre%" por el nombre completo (o numero si no esta en los contactos) del remitente. + Private pn As String = sbn.Title + If isGroupWA(sbn) Then pn = getPersonFromGroup(sbn.Title) + msjStr = msjStr.Replace(Matcher1.Match, pn) + else if Matcher1.Match.IndexOf("%primer_nombre%") > -1 Then 'Reemplaza el texto "%primerNombre%" por el nombre (hasta el primer espacio) o numero (si no esta en los contactos) del remitente. + Private pn As String = sbn.Title + If isGroupWA(sbn) Then pn = getPersonFromGroup(sbn.Title) + If Starter.logger Then Log(pn) + If Not(pn.StartsWith("+")) Then pn = Regex.Split(" ", pn)(0) + msjStr = msjStr.Replace(Matcher1.Match, pn) + else If Matcher1.Match.IndexOf("goto_") > -1 Then 'Manda el procesamiento de la siguiente regla a la regla especificada. + Private offs As String = Matcher1.Match.IndexOf("_") + offs = Matcher1.Match.SubString2(offs+1, Matcher1.Match.Length-1) + Subs.vamosA(sbn, offs) + msjStr = msjStr.Replace(Matcher1.Match, "") +' If starter.Logger Then Log(Matcher1.Match) +' If starter.Logger Then Log("==== goto: " & offs) + else If Matcher1.Match.IndexOf("rnd_") > -1 Then 'Remplaza %rnd_1,b,A,5% por una opcion al azar de las especificadas. + Private offs As String = Matcher1.Match.IndexOf("_") + offs = Matcher1.Match.SubString2(offs+1, Matcher1.Match.Length-1) + Private x() As String = Regex.Split(",", offs) + Private rando As Int = 0 ' Por si solo hay un elemento en la lista. + If x.Length > 1 Then rando = Rnd(0, x.Length) + If Starter.logger Then LogColor($"Random: 0-${x.Length-1} ${x(rando)} "$, Colors.Magenta) + msjStr = msjStr.Replace(Matcher1.Match, x(rando)) + else If Matcher1.Match.IndexOf("espera2_") > -1 Then 'Genera el tiempo de espera especificado en ms antes de mandar la respuesta. + Private offs As String = Matcher1.Match.IndexOf("_") + offs = Matcher1.Match.SubString2(offs+1, Matcher1.Match.Length-1) + espera = offs + msjStr = msjStr.Replace(Matcher1.Match, "") + else If Matcher1.Match.IndexOf("espera_") > -1 Then 'Genera el tiempo de espera al azar entre el minimo y maximo especificados en segundos antes de mandar la respuesta. +' Private offs As String = Matcher1.Match.IndexOf("_") + Dim params() As String = Regex.Split("_", Matcher1.Match) + If params.Length = 3 Then 'Solo procesamos el reemplazo si tiene 3 parametros. + Private minS As String = params(params.Length-2) 'Los segundos minimos. + Private maxS As String = params(params.Length-1) 'Los segundos maximos. + maxS = maxS.SubString2(0, maxS.Length-1) 'Quitamos el "%" del final. + Private espera2 As Int = Rnd(minS, maxS+1)*1000 + If Starter.logger Then LogColor($"min=${minS}, max=${maxS}, espera=${espera2}"$, Colors.red) + espera = espera2 + msjStr = msjStr.Replace(Matcher1.Match, "") + End If + End If + Loop + If Starter.logger Then LogColor("Remplazos completados - " & msjStr, Colors.Green) + Return msjStr +End Sub + +'Toma una lista de posibles respuestas (separadas por //) y regresa solo una al azar. +Sub procesaMultiMensajeRandom(mensaje As String) As String + Dim x() As String = Regex.Split("//", mensaje) +' For i = 0 To x.Length - 1 +' If starter.Logger Then Log($"len:${x.Length}, ${i}: ${x(i)}"$) +' Next + Private rando As Int = 0 ' Por si solo hay un elemento en la lista. + If x.Length > 1 Then rando = Rnd(0, x.Length) +' If starter.Logger Then LogColor($"Random: 0-${x.Length-1} ${x(rando).Trim} "$, Colors.Magenta) + Return x(rando) +End Sub + +'Procesa la cola de notificaciones (lista notificacionesPorContestar). +Sub procesaColaDeNotificaciones +' If starter.Logger Then LogColor("COLA = " & notificacionesPorContestar.Size, Colors.Green) +' If starter.Logger Then Log(notificacionesPorContestar) +' If starter.Logger Then Log($"${procesandoNotificaciones}, ${notificacionesPorContestar.size}"$) + Private hayError As Boolean = False + If Not(procesandoNotificaciones) And notificacionesPorContestar.Size > 0 Then + If Starter.logger Then Log("iniciamos procesando") + procesandoNotificaciones = True +' Private la As Int = 0 +' For i = 0 To notificacionesPorContestar.Size - 1 + If notificacionesPorContestar.Get(0) <> "DONE" Then + Try + Private tempMap As Map = notificacionesPorContestar.Get(0) + Private num As String = notificacionesPorContestar.Get(0).As(Map).GetKeyAt(0) + Dim t1 As lasNotis = tempMap.Get(num) +' If starter.Logger Then LogColor($"${num} - ${t1.notif.Message}"$, Colors.Blue) +' If starter.Logger Then Log(t1) + Dim t2 As StatusBarNotification = t1.notif +' If starter.Logger Then Log(t2) + Catch + Log(LastException) + hayError = True + End Try + If Not(hayError) Then + procesaNotificacion(t2) + If Starter.logger Then Log($"${notificacionesPorContestar.Get(0)}, ${notificacionesPorContestar.size}"$) + If Starter.logger Then Log("Ponemos 0 en DONE") + notificacionesPorContestar.Set(0, "DONE") + End If + End If +' la = i +' Next +' If starter.Logger Then Log(notificacionesPorContestar.Size) + End If + If notificacionesPorContestar.Size > 0 Then + For i=0 To notificacionesPorContestar.Size-1 'Borramos las notificaciones procesadas de la lista. + If notificacionesPorContestar.get(i) = "DONE" Then + notificacionesPorContestar.RemoveAt(i) + If Starter.logger Then Log("Removemos posicion " & i) + End If + Next + End If +' If starter.Logger Then Log(notificacionesPorContestar) +' If starter.Logger Then LogColor("COLA = " & notificacionesPorContestar.Size, Colors.red) + procesandoNotificaciones = False + Sleep(1) + If notificacionesPorContestar.Size > 0 Then procesaColaDeNotificaciones +End Sub + +'Procesa la notificación y reglas correspondientes. +'Recibe un objecto SBN (statusBarNotification). +Sub procesaNotificacion(sbn As StatusBarNotification) +' Try + Private numRemitente As String = getNumberOrGroupWA(sbn) + For Each m As Map In mapReglas.Values 'Revisamos si el mensaje dispara alguna regla. +' If starter.Logger Then Log(m) + Private destinatarioOk As Boolean = False + If m.Get("destinatario") = "Ambos" Then destinatarioOk = True + If m.Get("destinatario") = "Grupos" And isGroupWA(sbn) Then destinatarioOk = True + If m.Get("destinatario") = "Personas" And isPersonWA(sbn) Then destinatarioOk = True +' If starter.Logger Then Log(m.Get("destinatario") & "|" &"destinatarioOk="&destinatarioOk) +' If starter.Logger Then Log($"Regla: ${m.Get("nombre")}, activa:${m.Get("activa")}, recibe=${m.Get("recibe")}, contesta=${m.Get("contesta")}, mensaje: ${sbn.Message}"$) +' If starter.Logger Then LogColor(m.Get("contactoEspecifico"), Colors.Magenta) +' If starter.Logger Then LogColor($"================ Procesando regla ${m.Get("nombre")} ==========================="$, Colors.Magenta) + Private cumpleContactosEspecificos As Boolean = revisaContactosEspecificos(getGroupName(sbn.Title), m.Get("contactoEspecifico")) +' If starter.Logger Then Log(cumpleContactosEspecificos) +' If starter.Logger Then Log("COINCIDE="&coincideRegexSimple(m.Get("recibe"), sbn.Message)) + If m.Get("activa") = 1 And destinatarioOk And cumpleContactosEspecificos And coincideRegexSimple(m.Get("recibe"), sbn.Message) Then 'ignore +' If starter.Logger Then Log($"${m.Get("recibe")}, ${sbn.Message}"$) +' If starter.Logger Then LogColor("histReglas="&histReglas, Colors.Blue) + Dim esDep As Boolean = esDependiente(m) + Dim superior As String = traeSuperior(m) + Dim anterior As String = ultimaRegla +' If starter.Logger Then Log("Msg="&sbn.Message&" - Es dependiente="& esDep) +' If starter.Logger Then Log("dep="&esDep&" - regla superior="& superior & " Ultima R=" & anterior) + Private msjStr As String + If Not(esDep) Or (superior = anterior) Then 'Si no es dependiente, O si es dependiente Y la anterior es de la que dependemos, entonces + guardaMsjEntrada(sbn, m.Get("nombre")) +' If starter.Logger Then LogColor($"Regla:${m.Get("nombre")}"$, Colors.Blue) + Subs.guardaUltimaRegla(sbn, m.Get("nombre")) +' If starter.Logger Then Log(msjStr) + msjStr = procesaMultiMensajeRandom(m.Get("contesta")) +' If starter.Logger Then Log("===================== Mensaje ================="&CRLF& msjStr) + If msjStr.IndexOf("&&") > -1 Then 'Si hay respuestas multiples. + Private y() As String = Regex.Split("&&", msjStr) + For j = 0 To y.Length - 1 + espera = 10 + msjStr = procesaRemplazos(y(j).Trim, sbn) +' If starter.Logger Then LogColor("ESPERA="&espera, Colors.red) +' If starter.Logger Then LogColor("Reply: " & msjStr, Colors.Blue) + Sleep(espera) + If y(j).IndexOf("/cmd") > -1 Then 'Si hay que correr un comando ... + correSub(msjStr, sbn) + Sleep(1500) + Else if msjStr <> "" Then + If Starter.logger Then LogColor($"Mandamos respuesta (${msjStr})"$, Colors.Blue) + rp.reply(sbn.Notification, sbn.PackageName, msjStr) + guardaMsjSalida(sbn, msjStr) + End If + Next + Else 'Si SOLO es UNA respuesta ... + espera = 10 + msjStr = procesaRemplazos(msjStr.Trim, sbn) +' If starter.Logger Then LogColor("ESPERA="&espera, Colors.red) + If msjStr.IndexOf("/cmd") > -1 Then 'Si hay que correr un comando ... + correSub(msjStr, sbn) + Sleep(1500) + Else if msjStr <> "" Then + Sleep(espera) + If Starter.logger Then LogColor($"Mandamos respuesta (${msjStr})"$, Colors.Blue) + rp.reply(sbn.Notification, sbn.PackageName, msjStr) + guardaMsjSalida(sbn, msjStr) + End If + End If + Private thisP As String = getGroupName(sbn.Title) + If Not(notisIds.ContainsKey(thisP)) Then notisIds.Put(thisP, notisIds.Size+1) + If Starter.logger Then Log(notisIds.Get(thisP)) + If Starter.logger Then Log(notisIds) + + +' BigText_Notification(sbn, msjStr) 'Retiro temporal + + + + Exit 'Si ya encontramos una regla que se cumple, entonces salimos. + Else if superior = anterior Then 'Si es regla dependiente y la anterior es de la que dependemos, entonces ... +' If starter.Logger Then LogColor($"Regla anterior=${anterior}${CRLF}Sup:${superior} = anterior:${anterior}${CRLF}Regla anterior es igual a superior - ${msjStr}"$, Colors.green) +' Subs.guardaUltimaRegla(sbn, m.Get("nombre")) +' If starter.Logger Then Log("****************************************************"&CRLF& msjStr) +' msjStr = procesaRemplazos(m.Get("contesta"), sbn) +' If msjStr.IndexOf("&&") > -1 Then 'Si hay respuestas multiples ... +' Private y() As String = Regex.Split("&&", msjStr) +' For j = 0 To y.Length - 1 +' If starter.Logger Then LogColor("Reply: " & y(j), Colors.Blue) +' If y(j).IndexOf("/cmd") > -1 Then 'Si hay que correr un comando ... +' correSub(y(j), sbn) +' Else +' 'LogColor("Mandamos respuesta", Colors.red) +' rp.reply(sbn.Notification, sbn.PackageName, y(j)) +' End If +' Sleep(1200) +' Next +' Else 'Si SOLO es una respuesta ... +' If msjStr.IndexOf("/cmd") > -1 Then 'Si hay que correr un comando ... +' correSub(msjStr, sbn) +' Else +' 'If starter.Logger Then LogColor("Mandamos respuesta", Colors.red) +' rp.reply(sbn.Notification, sbn.PackageName, msjStr) +' End If +' End If +' Exit 'Si ya encontramos una regla que se cumple, entonces salimos. + End If + End If + Next +' Catch +' LogColor(LastException, Colors.red) +' End Try +End Sub + +'Regresa true o False dependiendo de: +'Si NO hay contactos especificados regresa TRUE. +'Si hay contactos especificados y el remitente esta dentro de ellos regresa TRUE +'Si hay contactos especificados y el remitente NO esta dentro de ellos regresa FALSE +Sub revisaContactosEspecificos(contacto As String, contactos As String) As Boolean 'ignore + Private result As Boolean = True + If contactos <> Null And contactos <> "" And contactos.Length > 3 Then 'Si hay contactos especificados ... +' If starter.Logger Then LogColor("Hay contactos especificados.", Colors.blue) +' If starter.Logger Then Log($"Buscamos ${contacto} en |${contactos}|"$) + result = False +' Private contEsp() As String = Regex.Split(",", contactos) +' Private l As List +' l.Initialize +' For i = 0 To contEsp.Length -1 +' l.Add(contEsp(i)) +' Next + Private c() As String = Regex.Split(",", contactos) +' If starter.Logger Then Log(c.Length) + For i = 0 To c.Length -1 +' Private x As String = c(i).Trim +' Log($"|${x}|"$) + If c(i).trim.EqualsIgnoreCase(contacto) Then + result = True + Exit + End If + Next +' If contactos.IndexOf(contacto) = -1 Then result = False 'Si el remitente no esta en los contactos permitidos regresamos FALSE. + End If +' If starter.Logger Then Log("Resultado = " & result) + Return result +End Sub + +'Guarda en la base de datos en mensaje de entrada. +Sub guardaMsjEntrada(sbn As StatusBarNotification, reglaCumplida As String) + Private thisP As String = getGroupName(sbn.Title) + Private thisN As String = getNumberWA(sbn) + If Starter.logger Then LogColor($"Guardamos mensaje de entrada: "${sbn.Message}""$, Colors.Blue) + Starter.historicoDB.ExecNonQuery2("insert into historico (numero, nombre, regla, mensaje, E_S, clic, fecha) values (?,?,?, ?, ?, ?, ?)", Array As Object (thisN, thisP, reglaCumplida, sbn.Message, "E", 0, Subs.fechaKMT(DateTime.now))) +End Sub + +'Guarda en la base de datos en mensaje de salida (respuesta). +Sub guardaMsjSalida(sbn As StatusBarNotification, msjStr As String) + Private thisP As String = getGroupName(sbn.Title) + Private thisN As String = getNumberWA(sbn) + If Starter.logger Then Log($"Guardamos "${msjStr}""$) + Starter.historicoDB.ExecNonQuery2("insert into historico (numero, nombre, mensaje, E_S, clic, fecha) values (?,?, ?, ?, ?, ?)", Array As Object (thisN, thisP, msjStr, "S", 0, Subs.fechaKMT(DateTime.now))) +End Sub + +Sub getHistNotis(remitente As String) As String + Private text, ES As String = "" + Private c As ResultSet = Starter.historicoDB.ExecQuery2("select mensaje, E_S from historico where nombre = ? and clic = 0", Array As String(remitente)) + If c.RowCount > 0 Then + Do While c.NextRow + ES = c.GetString("E_S") + If ES = "S" Then ES = "↗️ " Else ES = "↘️ " + text = text & CRLF & ES & c.GetString("mensaje") + Loop + End If + Return text +End Sub + +'Trae la notificacion de un numero dado, la notificacion debe estar previamente guardada en el mapa de notificaciones guardadas (notificacionesGuardadas). +Sub traeNotificacion(n As String) As StatusBarNotification 'ignore + Private tm As Map = notificacionesGuardadas.Get(n) + Private tm0 As StatusBarNotification + If tm.IsInitialized Then + Dim t1 As notificacionesGuardadasType = tm.Get(n) + Dim t2 As StatusBarNotification = t1.notif + If t2.IsInitialized Then + Return t2 + Else + If Starter.logger Then Log("No hay notificación para ese número.") + Return tm0 + End If + Else + If Starter.logger Then Log("No hay notificación para ese número.") + Return tm0 + End If +End Sub + +Sub NotificationSimple(titulo As String, text As String, id As Int) 'ignore + If Starter.logger Then Log($"Titulo=${titulo}, Texto=${text}, id=${id}"$) + Dim n As NB6 + n.Initialize(titulo, Application.LabelName, "DEFAULT").AutoCancel(True).SmallIcon(B4XPages.MainPage.notiIcon) + n.Build(titulo, text, titulo, Main).Notify(id) 'It will be Main (or any other activity) instead of Me if called from a service. +End Sub + +Sub BigText_Notification(sbn As StatusBarNotification, ultimoMsj As String) + Dim n As NB6 + Private titulo As String = getGroupName(sbn.Title) + Private text As String = getHistNotis(titulo).Trim + Private id As Int = notisIds.Get(titulo) + Private shortcut As String = getShortcut(sbn) + If Starter.logger Then Log($"Titulo=${titulo}, Texto=${text}, id=${id}"$) + If Not(notisIds.ContainsKey(titulo)) Then notisIds.Put(titulo, notisIds.Size+1) + n.Initialize("default", Application.LabelName, "LOW").AutoCancel(True).SmallIcon(B4XPages.MainPage.notiIcon) + n.BigTextStyle(titulo, "Chat con " & titulo, text) + n.Build(titulo, ultimoMsj, shortcut&"|"&titulo, Main).Notify(id) +End Sub + +Sub revisaConexion + If Starter.ultimoServidorConectado = "" Then Starter.ultimoServidorConectado = "http://keymon.lat:1782" + reqManager.Initialize(Me, Starter.ultimoServidorConectado) + If Starter.logger Then Log($"Intentamos con el servidor ${Starter.ultimoServidorConectado}"$) + cmd.Initialize + cmd.Name = "select_soporte" 'Intentamos conectarnos al servido publico y si no responde cambiamos al interno. + reqManager.ExecuteQuery(cmd , 0, "pruebaConexion", 750) 'request con timeout corto en ms. + DBRChecked = False + Do While Not(DBRChecked) ' Esperamos a que termine la prueba de conexion. + Sleep(20) + Loop +End Sub + +Sub recuperaClientes(sbn As StatusBarNotification) 'ignore + Private elNumero As String = getNumberWA(sbn) + agregaNotiParaJobDone(sbn) + cmd.Name = "proc_recuperaClientesNuevos" + cmd.Parameters = Array As Object("6","101","CHATBOT") + reqManager.ExecuteCommand(cmd ,$"procRecuperaClientes_${elNumero}"$) + If Starter.logger Then Log("Mandamos DBRequest procRecuperaClientes_: " & elNumero) +End Sub \ No newline at end of file diff --git a/B4A/ReplyAuto.b4a b/B4A/ReplyAuto.b4a new file mode 100644 index 0000000..7c055a7 --- /dev/null +++ b/B4A/ReplyAuto.b4a @@ -0,0 +1,154 @@ +Build1=Default,chv.bow2 +File1=add.png +File10=imgItem.bal +File11=mainPage.bal +File12=Page2.bal +File13=Page3.bal +File14=Reglas.bal +File15=reglas.db +File16=robot_192x192.png +File17=robot3_191x191.png +File18=robot4_191x191.png +File19=robot8_191x191.png +File2=add2.png +File20=robotic_191x191.png +File21=robot-icons_2_191x191.png +File22=ruleItem.bal +File3=chatbot6_191x191.png +File4=chatbot7_191x191.png +File5=contactItem.bal +File6=editaRegla.bal +File7=errores.db +File8=floatButton_layout.bal +File9=Imagenes.bal +FileGroup1=Default Group +FileGroup10=Default Group +FileGroup11=Default Group +FileGroup12=Default Group +FileGroup13=Default Group +FileGroup14=Default Group +FileGroup15=Default Group +FileGroup16=Default Group +FileGroup17=Default Group +FileGroup18=Default Group +FileGroup19=Default Group +FileGroup2=Default Group +FileGroup20=Default Group +FileGroup21=Default Group +FileGroup22=Default Group +FileGroup3=Default Group +FileGroup4=Default Group +FileGroup5=Default Group +FileGroup6=Default Group +FileGroup7=Default Group +FileGroup8=Default Group +FileGroup9=Default Group +Group=Default Group +Library1=administrator +Library10=phone +Library11=preoptimizedclv +Library12=randomaccessfile +Library13=reflection +Library14=runtimepermissions +Library15=sql +Library16=stringutils +Library17=xui views +Library18=replyauto +Library2=b4xpages +Library3=byteconverter +Library4=contentresolver +Library5=core +Library6=javaobject +Library7=json +Library8=nb6 +Library9=okhttputils2 +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~SetApplicationAttribute(android:usesCleartextTraffic, "true")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~'End of default text.~\n~SetActivityAttribute(main, android:windowSoftInputMode, adjustPan|stateHidden)~\n~AddPermission("android.permission.READ_CONTACTS")~\n~SetApplicationAttribute(android:theme, "@style/LightTheme")~\n~CreateResource(values, colors.xml,~\n~~\n~ #FFE30000~\n~ #FFE30000~\n~ #FFFFFFFF~\n~ #FFE30000~\n~~\n~)~\n~CreateResource(values-v20, theme.xml,~\n~~\n~ ~\n~~\n~)~\n~~\n~AddApplicationText(~\n~~\n~ ~\n~ ~\n~ ~\n~ )~\n~AddManifestText(~\n~~\n~)~\n~AddPermission("android.permission.ACCESS_SUPERUSER")~\n~~\n~AddApplicationText(~\n~ ~\n~ ~\n~ ~\n~ ~\n~)~\n~~\n~CreateResource(xml, device_admin.xml,~\n~~\n~ ~\n~ ~\n~ ~\n~ ~\n~ ~\n~~\n~)~\n~ +Module1=B4XImagenes +Module10=Subs +Module2=B4XMainPage +Module3=B4XPage4 +Module4=B4XReglas +Module5=cvFloatingBtn +Module6=DBRequestManager +Module7=NotificationService +Module8=reglas +Module9=Starter +NumberOfFiles=22 +NumberOfLibraries=18 +NumberOfModules=10 +Version=12.5 +@EndOfDesignText@ +#Region Project Attributes + #ApplicationLabel: Bow 2.0 + #VersionCode: 1 + #VersionName: 3.06.09 + 'SupportedOrientations possible values: unspecified, landscape or portrait. + #SupportedOrientations: portrait + #CanInstallToExternalStorage: False + #BridgeLogger: false +#End Region + +#Region Activity Attributes + #FullScreen: False + #IncludeTitle: True +#End Region + +Sub Process_Globals + +End Sub + +Sub Globals + +End Sub + +Sub Activity_Create(FirstTime As Boolean) 'ignore + Dim pm As B4XPagesManager + pm.Initialize(Activity) +End Sub + +'Template version: B4A-1.0 + +#Region Delegates + +Sub Activity_ActionBarHomeClick + B4XPages.Delegate.Activity_ActionBarHomeClick +End Sub + +Sub Activity_KeyPress (KeyCode As Int) As Boolean + Return B4XPages.Delegate.Activity_KeyPress(KeyCode) +End Sub + +Sub Activity_Resume + B4XPages.Delegate.Activity_Resume +End Sub + +Sub Activity_Pause (UserClosed As Boolean) + B4XPages.Delegate.Activity_Pause +End Sub + +Sub Activity_PermissionResult (Permission As String, Result As Boolean) + B4XPages.Delegate.Activity_PermissionResult(Permission, Result) +End Sub + +Sub Create_Menu (Menu As Object) + B4XPages.Delegate.Create_Menu(Menu) +End Sub + +'Sub btISend_Click +' Dim myIntent As Intent +' myIntent.Initialize("chv.bow2.setstatus.NEW_STATUS", "bow2://6") +' Dim p As Phone +' p.SendBroadcastIntent(myIntent) +' If starter.Logger Then Log("IntentTester: Intent sent.") +'End Sub + +#if Java +public boolean _onCreateOptionsMenu(android.view.Menu menu) { + processBA.raiseEvent(null, "create_menu", menu); + return true; + +} +#End If +#End Region + +'Program code should go into B4XMainPage and other pages. \ No newline at end of file diff --git a/B4A/ReplyAuto.b4a.meta b/B4A/ReplyAuto.b4a.meta new file mode 100644 index 0000000..b3f7c0d --- /dev/null +++ b/B4A/ReplyAuto.b4a.meta @@ -0,0 +1,36 @@ +ModuleBookmarks0= +ModuleBookmarks1= +ModuleBookmarks10= +ModuleBookmarks2= +ModuleBookmarks3= +ModuleBookmarks4= +ModuleBookmarks5= +ModuleBookmarks6= +ModuleBookmarks7=231 +ModuleBookmarks8= +ModuleBookmarks9= +ModuleBreakpoints0= +ModuleBreakpoints1= +ModuleBreakpoints10= +ModuleBreakpoints2= +ModuleBreakpoints3= +ModuleBreakpoints4= +ModuleBreakpoints5= +ModuleBreakpoints6= +ModuleBreakpoints7= +ModuleBreakpoints8= +ModuleBreakpoints9= +ModuleClosedNodes0= +ModuleClosedNodes1= +ModuleClosedNodes10= +ModuleClosedNodes2=1 +ModuleClosedNodes3= +ModuleClosedNodes4= +ModuleClosedNodes5= +ModuleClosedNodes6= +ModuleClosedNodes7= +ModuleClosedNodes8= +ModuleClosedNodes9= +NavigationStack=NotificationService,revisaContactosEspecificos,922,0,NotificationService,procesaNotificacion,911,0,Main,Create_Menu,61,0,B4XMainPage,b4xpage_appear,107,0,B4XMainPage,llenaLV,219,0,B4XImagenes,clv_imagenes_ItemClick,62,0,B4XImagenes,clv_imagenes_ItemLongClick,69,0,B4XMainPage,Class_Globals,0,0,B4XMainPage,B4XPage_Created,67,0,B4XMainPage,Initialize,48,0 +SelectedBuild=0 +VisibleModules=2,4,7,10,9,1,3,6 diff --git a/B4A/Starter.bas b/B4A/Starter.bas new file mode 100644 index 0000000..18edd05 --- /dev/null +++ b/B4A/Starter.bas @@ -0,0 +1,102 @@ +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 rp As RuntimePermissions + Dim reqManager As DBRequestManager 'ignore + Dim cmd As DBCommand 'ignore +' Dim DBRServer As String = "http://10.0.0.205:1782" + Dim DBRServer As String = "http://keymon.lat:1782" +' Dim DBRServer As String = "http://192.168.137.5:1782" + Dim ultimoServidorConectado As String = "" +' Dim DBRChecked As Boolean = False +' Dim pruebaPaso As Int = 0 + Dim desbloqueoUsrs As Map +' Dim ultimaReglaCumplida As Map + 'Para los Logs + Dim logs As StringBuilder + Private logcat As LogCat + Dim ruta As String + Dim starterStatus, nsStatus As Map + Dim notisMap2 As Map + Dim reglasDB, historicoDB, colaNotifs, waDB As SQL + Dim waPackage As String = "com.gbwhatsapp" + Dim waApp As String = "GBWhatsApp" + Dim waDir As String = $"/sdcard/Android/media/${waPackage}/${waApp}"$ + Dim Logger As Boolean = True + Dim showLogs As Boolean = False +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. + 'Para los Logs + #if RELEASE + logcat.LogCatStart(Array As String("-v","raw","*:F","B4A:v"), "logcat") + Logger = False + #end if + logs.Initialize +' Logger = True +End Sub + +Sub Service_Start (StartingIntent As Intent) + Service.StopAutomaticForeground 'Starter service can start in the foreground state in some edge cases. + desbloqueoUsrs.Initialize + Subs.revisaBD + ruta = File.DirInternal +' If Not(reglasDB.IsInitialized) Then + reglasDB.Initialize(ruta, "bow.db", True) + colaNotifs.Initialize(ruta, "colaNotifs.db", True) +' End If + If Logger Then LogColor(ruta, Colors.Red) + notisMap2.Initialize + starterStatus.Initialize + If NotificationService.starterStatus.IsInitialized Then starterStatus = NotificationService.starterStatus + starterStatus.Put(Subs.fechaKMT(DateTime.now),"inicia") + If NotificationService.nsStatus.IsInitialized Then + nsStatus.Initialize + nsStatus = NotificationService.nsStatus + Else If Not(NotificationService.nsStatus.IsInitialized) And nsStatus.IsInitialized Then + NotificationService.nsStatus.Initialize + NotificationService.nsStatus = nsStatus + Else + nsStatus.Initialize + NotificationService.nsStatus.Initialize + nsStatus.Put(Subs.fechaKMT(DateTime.now),"inicia") + NotificationService.nsStatus.Put(Subs.fechaKMT(DateTime.now),"inicia") + End If + If Logger Then Log($"starterStatus=${starterStatus}"$) +End Sub + +Sub Service_TaskRemoved + 'This event will be raised when the user removes the app from the recent apps list. +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.Initialize + logs.Append("Ver " & Application.VersionName & CRLF) + logs.Append(StackTrace) + Subs.revisaBD + Subs.errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (Subs.fechaKMT(DateTime.now), logs)) +' StartActivity(errorManager) 'errorManager despliega una pantalla con el error y manda el mensaje de error al servidor. + Return True +End Sub + +Sub Service_Destroy + starterStatus.put(Subs.fechaKMT(DateTime.now),"termina") +End Sub diff --git a/B4A/Subs.bas b/B4A/Subs.bas new file mode 100644 index 0000000..f0e7334 --- /dev/null +++ b/B4A/Subs.bas @@ -0,0 +1,1092 @@ +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 'Usa la libreria CompressStrings + Private su As StringUtils 'Usa la libreria StringUtils + Dim phn As Phone + Dim devModel As String + Dim kmt, errorLog As SQL 'Requiere la libreria "SQL" 'ignore +' Dim wifi As MLwifi + Dim ssid As String 'ignore +' Dim rutaInicioHoy As String = "" +End Sub + +'Pone el valor de phn.Model en la variable global "devModel" +Sub getPhnId As String 'ignore + 'Requiere la libreria "Phone" + 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 < 3 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 + Return devModel +End Sub + +'Comprime y regresa un texto (str) en base64 +Sub compress(str As String) As String 'ignore + 'Requiere la libreria "CompressStrings" +' Dim compressed() As Byte = GZip.compress(str) +' Dim base64 As String = su.EncodeBase64(compressed) +' Log($"Comprimido: ${base64.Length}"$) +' Return base64 +End Sub + +'Descomprime y regresa un texto en base64 +Sub decompress(base64 As String) As String 'ignore + Dim decompressedbytes() As Byte = su.DecodeBase64(base64) +' Log($"decompressedbytesLength: ${decompressedbytes.Length}"$) + Dim bc As ByteConverter + Dim uncompressed As String = bc.StringFromBytes(decompressedbytes,"UTF8") + If Starter.logger Then Log($"Descomprimido: ${uncompressed.Length}"$) +' Log($"Decompressed String = ${uncompressed}"$) + Return uncompressed +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 + +'Genera una notificacion con importancia alta +Sub notiHigh(title As String, body As String, activity As Object) 'ignore + Private notif As Notification + notif.Initialize2(notif.IMPORTANCE_HIGH) + notif.Icon = "icon" + notif.Vibrate = False + notif.Sound = False + notif.AutoCancel = True + If Starter.logger Then Log("notiHigh: "&title) + notif.SetInfo(title, body, activity) +' Log("notiHigh SetInfo") + notif.Notify(777) +End Sub + +'Regresa el objeto de una notificacion con importancia baja +Sub notiLowReturn(title As String, Body As String, id As Int) As Notification 'ignore + Private Notification As Notification + Notification.Initialize2(Notification.IMPORTANCE_LOW) + If Starter.logger Then Log("notiLowReturn: "&title) + Notification.Icon = "icon" + Notification.Sound = False + Notification.Vibrate = False + Notification.SetInfo(title, Body, Main) + Notification.Notify(id) +' Log("notiLowReturn SetInfo") + Return Notification +End Sub + +'Escribimos las coordenadas y fecha a un archivo de texto +Sub guardaInfoEnArchivo(coords As String) '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 + +'Escribimos las coordenadas (latitud, longitud, fecha) y fecha a una BD +Sub guardaInfoEnBD(coords As String) 'ignore + If Starter.logger Then Log("Guardamos ubicacion en BD - "&coords) + Try + Dim latlon() As String = Regex.Split("\|", coords) + If latlon.Length < 2 Then latlon = Regex.Split(",", coords) 'Si son menos de 2, entonces estan separadas por comas y no por "|" +' If Main.Logger Then Log("LatLon="&latlon) + If Not(kmt.IsInitialized) Then revisaBD + kmt.ExecNonQuery2("INSERT INTO RUTA_GPS(fecha, lat, lon) VALUES (?,?,?)", Array As Object (latlon(2),latlon(0),latlon(1))) + Catch + Log(LastException) + End Try +End Sub + +'Limpiamos la tabla RUTA_GPS de la BD +Sub deleteGPS_DB 'ignore + kmt.ExecNonQuery("delete from RUTA_GPS") + kmt.ExecNonQuery("vacuum;") +End Sub + +'Limpiamos la tabla errorLog de la BD +Sub deleteErrorLog_DB 'ignore + If Not(errorLog.IsInitialized) Then revisaBD + errorLog.ExecNonQuery("delete from errores") + errorLog.ExecNonQuery("vacuum;") +' ToastMessageShow("Borrada", False) +End Sub + +'Borramos el archio "gps.txt" +Sub borramosArchivoGPS 'ignore + 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 + +'Revisa que exista la BD y si es necesario crea algunas tablas dentro de ella +Sub revisaBD 'ignore +' Log("subs.revisaBD") + Starter.ruta = File.DirInternal + If Not(Starter.colaNotifs.IsInitialized) Then Starter.colaNotifs.Initialize(Starter.ruta, "colaNotifs.db", True) + Starter.colaNotifs.ExecNonQuery("CREATE TABLE If Not EXISTS cola (id INTEGER UNIQUE, numero TEXT, contestada INTEGER, timestamp INTEGER, PRIMARY KEY(id AUTOINCREMENT))") + 'Tabla para la reglas + If Not(Starter.reglasDB.IsInitialized) Then Starter.reglasDB.Initialize(Starter.ruta, "bow.db", True) + If Starter.logger Then LogColor("========"&Starter.ruta, Colors.Red) + Starter.reglasDB.ExecNonQuery("CREATE TABLE If Not EXISTS reglas (id INTEGER UNIQUE, nombre TEXT, activa INTEGER, recibe TEXT, contesta TEXT, destinatario TEXT, contactosSI TEXT, PRIMARY KEY(id AUTOINCREMENT))") + 'Tabla para las imagenes + Starter.reglasDB.ExecNonQuery("CREATE TABLE If Not EXISTS datosImg (message_row_id INTEGER, chat_row_id INTEGER, autotransfer_retry_enabled INTEGER, media_job_uuid TEXT, transferred INTEGER, transcoded INTEGER, file_path TEXT, file_size INTEGER, suspicious_content INTEGER, trim_from INTEGER, trim_to INTEGER, face_x INTEGER, face_y INTEGER, media_key_timestamp INTEGER, width INTEGER, height INTEGER, has_streaming_sidecar INTEGER, gif_attribution INTEGER, thumbnail_height_width_ratio REAL, first_scan_length INTEGER, file_length INTEGER, media_name TEXT, file_hash TEXT, media_duration INTEGER, page_count INTEGER, enc_file_hash TEXT, is_animated_sticker INTEGER, mute_video INTEGER)") + Starter.reglasDB.ExecNonQuery("CREATE TABLE If Not EXISTS datosMsj (_id INTEGER, key_remote_jid TEXT, key_from_me INTEGER, key_id TEXT, status INTEGER, needs_push INTEGER, timestamp INTEGER, media_wa_type TEXT, media_size INTEGER, media_name TEXT, media_caption TEXT, media_hash TEXT, media_duration INTEGER, origin INTEGER, latitude REAL, longitude REAL, thumb_image TEXT, received_timestamp INTEGER, send_timestamp INTEGER, receipt_server_timestamp INTEGER, receipt_device_timestamp INTEGER, recipient_count INTEGER, quoted_row_id INTEGER, edit_version INTEGER, media_enc_hash TEXT, forwarded INTEGER, preview_type INTEGER, lookup_tables INTEGER, future_message_type INTEGER, message_add_on_flags INTEGER)") + 'Tabla para la notificaciones + If Not(Starter.historicoDB.IsInitialized) Then Starter.historicoDB.Initialize(Starter.ruta, "historicoDB.db", True) + Starter.historicoDB.ExecNonQuery("CREATE TABLE If Not EXISTS historico (id INTEGER UNIQUE, numero TEXT, nombre TEXT, regla TEXT, mensaje TEXT, E_S TEXT, clic TEXT, fecha TEXT, PRIMARY KEY(id AUTOINCREMENT))") + 'Tabla para la bitacora de errores + If Not(errorLog.IsInitialized) Then errorLog.Initialize(Starter.ruta, "errores.db", True) + errorLog.ExecNonQuery("CREATE TABLE IF NOT EXISTS errores(fecha INTEGER, error TEXT)") + + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna "numero" en la tabla + Dim c As Cursor=Starter.historicoDB.ExecQuery("SELECT COUNT(*) AS fCol FROM pragma_table_info('historico') WHERE name='numero'") + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna FECHA la agregamos + Starter.historicoDB.ExecNonQuery("ALTER TABLE historico ADD COLUMN numero TEXT") + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + Starter.historicoDB.ExecNonQuery("ALTER TABLE historico ADD COLUMN numero TEXT") + Catch + Log(LastException) + End Try + End Try + Try 'Intentamos usar "pragma_table_info" para revisar si existe la columna "regla" en la tabla + Dim c As Cursor=Starter.historicoDB.ExecQuery("SELECT COUNT(*) AS fCol FROM pragma_table_info('historico') WHERE name='regla'") + c.Position = 0 + If c.GetString("fCol") = 0 Then 'Si no esta la columna FECHA la agregamos + Starter.historicoDB.ExecNonQuery("ALTER TABLE historico ADD COLUMN regla TEXT") + End If + Catch 'Si no funciona "pragma_table_info" lo hacemos con try/catch + Try + Starter.historicoDB.ExecNonQuery("ALTER TABLE historico ADD COLUMN regla TEXT") + Catch + Log(LastException) + End Try + End Try +End Sub + +'Obtiene el ssid al que esta conectado el telefono +Sub getSSID 'ignore +' 'Requiere la libreria "MLWifi400" +' If wifi.isWifiConnected Then +' ssid = wifi.WifiSSID +' End If +End Sub + +'Convierte un texto en formato JSON a un objeto "Map" +Sub JSON2Map(theJson As String) As Map 'ignore + 'Requiere la libreria "JSON" + Try + Private json As JSONParser + json.Initialize(theJson) + Return json.NextObject + Catch + Log(LastException) + log2DB("JSON2Map: "&LastException) + Private m As Map = CreateMap("title":"Error generating JSON", "t":"Error", "Message":LastException, "text" : LastException) + Return m + End Try +End Sub + +'Convierte un mapa a formato JSON +Sub map2JSON(m As Map) As String 'ignore + 'Requiere la libreria "JSON" + 'Convierte un objecto "Map" a JSON + Dim jg As JSONGenerator + jg.Initialize(m) + Dim t As String = jg.ToString + Return t +End Sub + +'Mandamos "coords" en un mensaje a "Sprvsr" +Sub mandamosLoc(coords As String) 'ignore + '' Log("Iniciamos mandamosLoc "&coords) + '' Log("locRequest="&Tracker.locRequest) +' guardaInfoEnBD(coords)'Escribimos coordenadas y fecha a una bd +' Dim t As String +' If Tracker.locRequest="Activa" Then +' If PushService.au = 1 Then +' t = "au" ' es una actualizacion +' Else +' t = "u" ' es una peticion +' End If +' Dim params As Map = CreateMap("topic":"Sprvsr", "coords":coords, "t":t, "b":PushService.battery) +' CallSub2(PushService, "mandaMensaje",params) +' Tracker.locRequest="Enviada" +' CallSubDelayed(Tracker,"CreateLocationRequest") +' End If +End Sub + +'Regresa la fecha y hora de hoy a las 00:00 en el formato "yyMMddHHMMSS" +Sub fechaInicioHoy As String 'ignore + Dim OrigFormat As String = DateTime.DateFormat 'save orig date format + DateTime.DateFormat="yyMMdd" + Private h As String = DateTime.Date(DateTime.Now)&"000000" + DateTime.DateFormat=OrigFormat 'return to orig date format + If Starter.logger Then Log("Hoy="&h) + Return h +End Sub + +'Guardamos "texto" a la bitacora +Sub log2DB(texto As String) 'ignore + LogColor(fechaKMT(DateTime.Now)&" - log2BD: '"&texto&"'", Colors.Magenta) + If kmt.IsInitialized Then kmt.ExecNonQuery2("INSERT INTO bitacora(fecha, texto) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), texto)) +End Sub + +'Regresa verdadero si ya pasaron XX minutos de la fecha dada +Sub masDeXXMins(hora As Int, mins As Int) As Boolean 'ignore + If (hora + mins * DateTime.TicksPerMinute) < DateTime.Now Then + Return True + Else + Return False + End If +End Sub + +'Regresa verdadero si ya pasaron XX minutos de la fechaKMT dada +Sub masDeXXMinsKMT(hora As String, mins As Int) As Boolean 'ignore + Try + ' LogColor($"Hora=${fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute)}, Mins=${mins}, Actual=${fechaKMT(DateTime.Now)}"$,Colors.red) + If fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute < DateTime.Now Then +' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " < " & fechaKMT(DateTime.Now)) + Return True + Else + ' Log("+++ +++ "&fechaKMT(fechaKMT2Ticks(hora) + mins * DateTime.TicksPerMinute) & " > " & fechaKMT(DateTime.Now)) + Return False + End If + Catch + Log(LastException) + End Try +End Sub + +'Limpiamos la tabla "bitacora" de la BD +Sub borraLogDB 'ignore + If Starter.logger Then LogColor("Borramos BD de log", Colors.Magenta) + kmt.ExecNonQuery("delete from bitacora") + kmt.ExecNonQuery("vacuum;") +End Sub + +'Borramos renglones extra de la tabla de errores +Sub borraArribaDe100Errores 'ignore + If Not(errorLog.IsInitialized) Then revisaBD + If Starter.logger Then LogColor("Recortamos la tabla de Errores, limite de 100", Colors.Magenta) + errorLog.ExecNonQuery("DELETE FROM errores WHERE fecha NOT in (SELECT fecha FROM errores ORDER BY fecha desc LIMIT 99 )") + errorLog.ExecNonQuery("vacuum;") +' Log("Borramos mas de 100 de errorLog") +End Sub + +'Borramos renglones extra de la tabla de bitacora +Sub borraArribaDe600RenglonesBitacora 'ignore + revisaBD + If Starter.logger Then LogColor("Recortamos la tabla de la Bitacora, limite de 600", Colors.Magenta) + Private c As Cursor + c = kmt.ExecQuery("select fecha from bitacora") + c.Position = 0 + If c.RowCount > 650 Then + kmt.ExecNonQuery("DELETE FROM bitacora WHERE fecha NOT in (SELECT fecha FROM bitacora ORDER BY fecha desc LIMIT 599 )") + kmt.ExecNonQuery("vacuum;") +' Log("Borramos mas de 600 de bitacora") + End If + c.Close +End Sub + +'Inserta 50 renglones de prueba a la tabla "errores" +Sub insertaRenglonesPruebaEnErrorLog 'ignore + If Not(errorLog.IsInitialized) Then revisaBD + If Starter.logger Then Log("insertamos 50 renglones a errorLog") + For x = 1 To 50 + errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), "abc")) + If Starter.logger Then Log(x) + Next +End Sub + +'Regresa la tabla "errores" en una lista de mapas convertida a JSON +Sub dameErroresJSON(SQL As SQL, maxErrores As Int, comprimido As Boolean) As String 'ignore + If Starter.logger Then Log("dameErroresJSON") + Private j As JSONGenerator + Private lim As String + Private cur As ResultSet + Private l As List + Private i As Int = 0 + l.Initialize + Dim m, m2 As Map + m2.Initialize + If maxErrores = 0 Then lim = "" Else lim = "limit "&maxErrores + cur = SQL.ExecQuery("select * from errores order by fecha desc "&lim) + Do While cur.NextRow + m.Initialize + m.Put("fecha", cur.GetString("fecha")) + m.Put("error", cur.GetString("error")) + m2.Put(i,m) + i = i + 1 + Loop + cur.Close + j.Initialize(m2) + Log(j.ToString) + If comprimido Then + Return compress(j.ToString) + Else + Return j.ToString + End If +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) +' Log(" +++ +++ pFecha:"&parteFecha&" | pHora:"&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(LastException) + If Starter.logger Then LogColor($"Fecha dada: ${fKMT}, Parte Fecha: ${parteFecha}, Parte Hora: ${parteHora}"$, Colors.Red) + Return 0 + End Try +End Sub + +Sub InstallAPK(dir As String, apk As String) 'ignore +' If File.Exists(dir, apk) Then +' Dim i As Intent +' i.Initialize(i.ACTION_VIEW, "file://" & File.Combine(dir, apk)) +' i.SetType("application/vnd.android.package-archive") +' StartActivity(i) +' End If +End Sub + +'Hace visible el panel con los parametros "Top" y "Left" dados +Sub panelVisible(panel As Panel, top As Int, left As Int) 'ignore + panel.BringToFront + panel.Visible = True + panel.Top = top + panel.Left = left +End Sub + +'Oculta el panel especificado y lo manda al fondo +Sub panelOculto(panel As Panel) 'ignore + panel.SendToBack + panel.Visible = False +End Sub + +'Centra una etiqueta dentro de un elemento superior +Sub centraEtiqueta(elemento As Label, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Centra un panel dentro de un elemento superior +Sub centraPanel(elemento As Panel, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +'Centra una barra de progreso dentro de un elemento superior +Sub centraProgressBar(elemento As ProgressBar, anchoElementoSuperior As Int) 'ignore + elemento.Left = Round(anchoElementoSuperior/2)-(elemento.Width/2) +End Sub + +Sub insertaEnErrores(error As String) 'ignore + If Not(errorLog.IsInitialized) Then revisaBD + errorLog.ExecNonQuery2("INSERT INTO errores(fecha, error) VALUES (?,?)", Array As Object (fechaKMT(DateTime.now), error)) +End Sub + +'Cierra todas las actividades y sale de la aplicacion (Android 4.1+ - API 16+) +Sub cierraActividades 'ignore + If Starter.logger Then Log("closing activities") + Dim jo As JavaObject + jo.InitializeContext + jo.RunMethod("finishAffinity", Null) +End Sub + +'Regresa un mapa con las reglas. +Sub traeReglas As Map + If Starter.logger Then LogColor("Traemos reglas de BD", Colors.Magenta) + Private mReglas As Map + mReglas.Initialize + Private c As Cursor +' c=Starter.reglasDB.ExecQuery("select * from reglas order by nombre") + c=Starter.reglasDB.ExecQuery("Select *, SUBSTR(nombre, (INSTR(nombre, '_')+1), (LENGTH(nombre)-INSTR(nombre, '_'))) as ord FROM reglas order by ord") 'Este query trae las reglas ordenadas por "nombre" que tienen texto como "1.1.2, 10.2.1, 13.1" + If c.RowCount > 0 Then + Private mr As Map + For i=0 To c.RowCount -1 + c.Position = i + Private contactosSI As String = c.GetString("contactosSI") + If contactosSI = Null Then contactosSI = "" + mr = CreateMap("activa":c.GetInt("activa"), "recibe":c.GetString("recibe"), "contesta":c.GetString("contesta"), "id":c.GetInt("id"), "nombre":c.GetString("nombre"), "destinatario":c.GetString("destinatario"), "contactoEspecifico":contactosSI) + mReglas.Put(c.GetInt("id"), mr) + Next + End If + c.Close +' LogColor("mReglas=" & mReglas, Colors.Blue) + Return mReglas +End Sub + +'Activa o desactiva la regla especificada. +Sub guardaRegla(id As Int, activa As Boolean) +' Private c As Cursor + Private act As Int = 0 + If activa Then act = 1 + If Starter.logger Then Log("Guardamos regla " & id) + If Starter.logger Then Log($"update reglas set activa=${act} where id=${id}"$) + Starter.reglasDB.ExecNonQuery($"update reglas set activa=${act} where id=${id}"$) +End Sub + +'Agrega una regla en blanco y descativada a la base de datos. +Sub agregaRegla + Starter.reglasDB.ExecNonQuery("insert into reglas (activa, recibe, contesta) values (0, '', '')") + Dim c As Cursor + c=Starter.reglasDB.ExecQuery("select last_insert_rowid() as ultimo from reglas") 'Traemos el id de la ultima regla agregada. + If c.RowCount > 0 Then + c.Position = 0 + Starter.reglasDB.ExecNonQuery($"update reglas set nombre = ${c.GetInt("ultimo")} where id = ${c.GetInt("ultimo")}"$) 'Y lo ponemos en el nombre. + End If +End Sub + +'Borra una regla de la base de datos. +Sub borrarRegla (id As Int) + Starter.reglasDB.ExecNonQuery($"delete from reglas where id=${id}"$) + Starter.reglasDB.ExecNonQuery("delete from sqlite_sequence where name='reglas'") + Starter.reglasDB.ExecNonQuery("vacuum;") +End Sub + +'Guarda el objeto de la notificacion en un mapa y en la cola de notificaciones por contestar. +Sub guardaNotificacion(sbn As StatusBarNotification) 'ignore + If Starter.logger Then Log("guardaNotificacion=" & sbn.Title & " - " & sbn.Message) + Private noti As lasNotis + noti.Initialize + noti.numero = sbn.Title + noti.notif = sbn + Dim titulo As String = sbn.Title + If isGroupWA(sbn) Then titulo = getGroupName2(sbn) + Private tempMap As Map + tempMap.Initialize + Private timestamp = DateTime.Now + tempMap.Put(titulo, noti) + NotificationService.notisMap2.Put(titulo, tempMap) + Starter.notismap2 = NotificationService.notisMap2 + NotificationService.notificacionesPorContestar.Add(tempMap)'Tambien lo agregamos a la cola de notificaciones por contestar. + If Starter.logger Then LogColor("======== Notificaciones pendientes:" & NotificationService.notificacionesPorContestar.Size & "=============", Colors.Magenta) +' LogColor("Cola de notificaciones="&NotificationService.notificacionesPorContestar, Colors.RGB(168,0,0)) +End Sub + +'Searches the provided notification object for the string "@g.us" and if found returns TRUE. +Sub isGroupWA(sbn As StatusBarNotification) As Boolean + Private a As Boolean = False + If sbn.As(String).IndexOf("@g.us") > -1 Then a = True 'ignore + Return a +End Sub + +'Returns the name of the group from the given notification object. +'Searches the provided notification for the string "hiddenConversationTitle" and if found, gets the name. +'If it is not a group returns the notification's title. +Sub getGroupName2(sbn As StatusBarNotification) As String + Private inicio As Int = sbn.Extras.As(String).IndexOf("hiddenConversationTitle=") 'ignore + If inicio > -1 And sbn.Extras.As(String).IndexOf("hiddenConversationTitle=null") = -1 Then 'ignore + Private x As String = sbn.Extras.As(String) 'ignore + Private fin As Int = x.IndexOf(", android.reduced.images=") + x = x.SubString2(inicio+24, fin) + x = Regex.Replace(" \(.+\)", x, "") 'Replace anything between () with "", this en the case that we have something like "MyGroupName (5 messages)" + Else 'Is not from a group. + Private x As String = sbn.Title + End If + Return x +End Sub + +'Guarda la ultima regla que se haya cumplido y el número que la mandó. +Sub guardaUltimaRegla(sbn As StatusBarNotification, regla As String) 'ignore + Private numRemitente As String = getNumberWA(sbn) + If numRemitente = "Not a person" Then numRemitente = getGroupName(sbn.Title) + Private tmpMap As Map + tmpMap.Initialize + If NotificationService.histReglas.ContainsKey(numRemitente) Then tmpMap = NotificationService.histReglas.Get(numRemitente) +' Log("+++++++++++++++++++++++++++++++++++++++++++") +' Log(numRemitente) +' LogColor("histReglas="&NotificationService.histReglas,Colors.Blue) +' Log(regla) +' Log("tmpMap="&tmpMap) + Private tmpList, tmpList2 As List + tmpList.Initialize + tmpList2.Initialize + If tmpMap.ContainsKey("historico") Then tmpList = tmpMap.Get("historico") + If tmpMap.ContainsKey("histReglas") Then tmpList2 = tmpMap.Get("histReglas") +' Log(regla) + Private ur As String = "" + If tmpList.Size > 0 And tmpList.Get(0).As(Map).Size > 0 Then ur = tmpList.Get(0).As(Map).Get("regla") +' Log("Regla anterior: "&ur) +' LogColor(tmpList, Colors.red) + Private tm As Map = CreateMap("regla":regla, "mensaje":sbn.Message, "anterior":ur, "numero":numRemitente) + tmpList2.InsertAt(0, regla) +' LogColor("ponemos en historico:"&tm, Colors.Magenta) + tmpList.InsertAt(0, tm) +' Log(tm) + tmpMap = CreateMap("histReglas":tmpList2, "historico":tmpList, "numero":numRemitente) +' Log(tmpMap) + NotificationService.histReglas.Put(numRemitente, tmpMap) +' Starter.ultimaReglaCumplida.Put(numRemitente, tmpMap) +' Log(NotificationService.histReglas) +' Log("+++++++++++++++++++++++++++++++++++++++++++++") +' For i = 0 To tmpList.Size -1 +' Log(tmpList.Get(i)) +' Next +' Log("histReglas="&NotificationService.histReglas) +End Sub + +'Manda el procesamiento de la siguiente regla a la regla especificada. +Sub vamosA( sbn As StatusBarNotification, regla As String) + Private numRemitente As String = getNumberWA(sbn) + If numRemitente = "Not a person" Then numRemitente = getGroupName(sbn.Title) + Private tmpMap As Map + tmpMap.Initialize + If NotificationService.histReglas.ContainsKey(numRemitente) Then tmpMap = NotificationService.histReglas.Get(numRemitente) + Private tmpList, tmpList2 As List + tmpList.Initialize + tmpList2.Initialize + If tmpMap.ContainsKey("historico") Then tmpList = tmpMap.Get("historico") + If tmpMap.ContainsKey("histReglas") Then tmpList2 = tmpMap.Get("histReglas") + If Starter.logger Then Log(regla) + Private ur As String = "" 'ignore + If tmpList.Size > 0 And tmpList.Get(0).As(Map).Size > 0 Then ur = tmpList.Get(0).As(Map).Get("regla") +' Log("Regla anterior: "&ur) +' Private tm As Map = CreateMap("regla":regla, "mensaje":sbn.Message, "anterior":ur, "numero":numRemitente) 'ignore + tmpList2.InsertAt(0, regla) +' LogColor("ponemos en historico:"&tm, Colors.Magenta) +' tmpList.InsertAt(0, tm) + tmpMap = CreateMap("histReglas":tmpList2, "historico":tmpList, "numero":numRemitente) + NotificationService.histReglas.Put(numRemitente, tmpMap) + If Starter.logger Then Log("histReglas="&NotificationService.histReglas) +End Sub + +'Returns the sender's number. +'Searches the provided notification object and gets the numbers between "shortcut=" and "@s.whatsapp.net". +Sub getNumberWA(sbn As StatusBarNotification) As String + Private a As Int = sbn.As(String).IndexOf("@s.whatsapp.net") 'ignore + If a > -1 Then + Private x As String = sbn.As(String) 'ignore + Private y As Int = x.IndexOf("shortcut=") + x = x.SubString2(y+9, a) + Else 'It is probably is a group. + x = "Not a person" + End If + Return x +End Sub + +'Returns the name of the group from the given text. +'If it is not a group, then returns the notification's title. +Sub getGroupName(sbnTitle As String) As String 'ignore + Private a As Int = sbnTitle.IndexOf(": ") + Private x As String = sbnTitle + If a > -1 Then + Private b As String = sbnTitle.SubString2(0, a) + x = Regex.Replace(" \(.+\)", b, "") + End If + Return x +End Sub + +'Copia la base de datos de las reglas a la tarjeta de memoria. +Sub copiaDB + Private theDir As String = "" + Try + File.MakeDir(File.DirRootExternal, "Bow2.0") + theDir = "/Bow2.0" + Catch + theDir = "" + End Try + If Starter.logger Then Log($"Origen:${Starter.ruta}, destino:${File.DirRootExternal}"$) + Try + File.Copy(File.DirInternal,"bow.db",File.DirRootExternal&theDir,"bow.db") + File.Copy(File.DirInternal,"historicoDB.db",File.DirRootExternal&theDir,"historicoDB.db") + ToastMessageShow("Listo, copiado a " & File.DirRootExternal&theDir & "/bow.db", False) + Catch + ToastMessageShow("No se pudo hacer la copia: "&LastException, True) + End Try +End Sub + +'Actualiza una regla modificada. +Sub actualizaRegla(id As Int, nombre As String, recibe As String, contesta As String, destinatario As String, contactosSI As String) + Starter.reglasDB.ExecNonQuery2("update reglas set nombre = ?, recibe = ?, contesta = ?, destinatario = ?, contactosSI = ? where id = ?", Array As Object(nombre, recibe, contesta, destinatario, contactosSI, id)) + If Starter.logger Then Log($"========== ${nombre}, ${recibe}, ${contesta}, ${id}, ${destinatario}, ${contactosSI}"$) + If Starter.logger Then Log("Guardado") +End Sub + +'Regresa el "shortcut" del remitente. +'Si es de un grupo es algo como "120363023512345678@g.us" +'Si es de una persona entonces "5215512345678@s.whatsapp.net" +Sub getShortcut(sbn As StatusBarNotification) As String + Private x As String = sbn.As(String) 'ignore + Private ap As Int = x.IndexOf("@s.whatsapp.net") 'ignore + Private ag As Int = x.IndexOf("@g.us") 'ignore + Private sc As Int = x.IndexOf("shortcut=") + If x.IndexOf("Notification(channel=group") = -1 And x.IndexOf("Notification(channel=individual") = -1 And x.IndexOf("Notification(channel=silent") = -1 Then 'En algunos casos el "channel" trae el "shortcut" y estorba para en "indexOf". + sc = x.IndexOf("channel=") - 1 + End If + If Starter.logger Then LogColor(x, Colors.red) + If ap > -1 Then + Private x As String = sbn.As(String) 'ignore + If Starter.logger Then Log($"x:${x}, y:${sc}, ag:${ap}"$) + x = x.SubString2(sc+9, ap+15) + Else if ag > -1 Then 'It is probably is a group. + Private x As String = sbn.As(String) 'ignore + If Starter.logger Then Log($"x:${x}, y:${sc}, ag:${ag}"$) + x = x.SubString2(sc+9, ag+5) + End If + Return x +End Sub + +'Abre Whatsapp en el chat especificado. +Sub abreWAChat(chat As String) +' Dim num As String = "5215554192439@s.whatsapp.net" +' Dim grupo As String = "120363022847621622@g.us" + Dim i As Intent + i.Initialize("android.intent.action.SEND", "") + i.SetType("text/plain") + i.PutExtra("android.intent.extra.TEXT", " ") + i.PutExtra("jid", chat) + i.SetPackage("com.whatsapp") + StartActivity(i) +End Sub + +'Regresa el numero de veces que aparece un caracter en la cadena dada. +'Esta funcion la ocupo para reconocer las reglas que dependen de otras (Submenus). +Sub CountChars(text As String, substr As String) As Int + Dim t As String = text.Replace(substr, "") + Return text.Length - t.Length +End Sub + +'Change CheckBox colors +Sub SetButtonTintList(View As View, Disabled As Int, Enabled As Int) + Dim States(2,1) As Int + Dim sd As StateListDrawable 'ignore + States(0, 0) = sd.State_Enabled + States(1, 0) = sd.State_Disabled + Dim Color(2) As Int = Array As Int(Enabled, Disabled) + Dim CSL As JavaObject + CSL.InitializeNewInstance("android.content.res.ColorStateList",Array(States,Color)) + Dim jo As JavaObject + jo.InitializeStatic("android.support.v4.widget.CompoundButtonCompat") + jo.RunMethod("setButtonTintList", Array(View, CSL)) +End Sub + +'Regresa una lista con los nombres de los contactos del telefono. +Sub getContactos As List + Dim cr As ContentResolver + cr.Initialize("cr") + Private PeopleProjection() As String = Array As String("display_name") + Private l As List + l.Initialize + Dim u As Uri + u.Parse("content://com.android.contacts/contacts") + Dim c As Cursor = cr.Query(u, PeopleProjection, "", Null, "display_name") + For i = 0 To c.RowCount - 1 + c.Position = i +' Log($"${c.GetString("display_name")}"$) + l.Add(c.GetString("display_name")) + Next + c.Close + Return l +End Sub + +'Remove duplicates from a list. +'Returns the list without duplicates. +Sub removeListDuplicates(pList As List) As List + If pList = Null Or Not(pList.IsInitialized) Then Return pList + If Starter.logger Then Log(pList) + Dim lstNew As List : lstNew.Initialize + Dim objItem As Object + + For i = 0 To pList.Size - 1 + objItem = pList.Get(i) + If lstNew.IndexOf(objItem) = - 1 Then + lstNew.Add(objItem) + End If + Next + If Starter.logger Then Log(lstNew) + Return lstNew +End Sub + +'Manda un mensaje al número especificado (+52 55 XXXX XXXX) mediante un objeto SBN (StatusBarNotification). +'Es necesario que se haya recibido previamente un mensaje del numero especificado. +Sub mandaWAMsjSBN(numero As String, mensaje As String) 'ignore + If numero = Null Then numero = "+52 55 5419 2439" + Dim tempMap As Map = NotificationService.notisMap2.Get(numero) + If tempMap.IsInitialized Then + Dim t1 As lasNotis = tempMap.Get(numero) + Dim t2 As StatusBarNotification = t1.notif + If t2.IsInitialized Then + NotificationService.rp.reply(t2.Notification, t2.PackageName, mensaje) + CallSubDelayed3(NotificationService, "guardaMsjSalida", t2, mensaje) + End If + Else + ToastMessageShow($"No hay notificaciones de ${numero}"$, False) + End If +End Sub + +'Converts an image to a bytes array (for BLOB fields). +Public Sub ImageToBytes(Image As Bitmap) As Byte() + Dim out As OutputStream + out.InitializeToBytesArray(0) + Image.WriteToStream(out, 100, "JPEG") + out.Close + Return out.ToBytesArray +End Sub + +'Manda un mensaje al número especificado (52155XXXXXXXX) mediante un script de shell y root. +'El celular necesita estar rooteado. +'El destinatario debe tener la lada completa sin signos de mas, es decir, para mexico 521 + el numero a 10 digitos. +Sub mandaWAMsjRoot(mensaje As String, destinatario As String) 'ignore + Private waPackage As String = "com.whatsapp" + Dim Command, Runner As String + Dim StdOut, StdErr As StringBuilder + StdOut.Initialize + StdErr.Initialize + Dim Result As Int + Dim Ph As Phone + Private jid As String = $"${destinatario}@s.whatsapp.net"$ + Private key_id As String = $"${DateTime.Now}-1"$ + Private mensaje As String = $"/msjTest ${mensaje} ${DateTime.Time(DateTime.Now)}"$ + Private received_timestamp As String = "0" +' Log(key_id) + +' ******************************************************************************************* +' ******************************************************************************************* +' Hay que revisar que el numero del destinatario exista en la tabla "jid.user" y si no existe, entonces agregarlo: +' user server Agent Type raw_string device +' 5215554192439 s.whatsapp.net 0 0 5215554192439@s.whatsapp.net 0 + +' Hay que agregar en la tabla "chat": +' - el renglon correspondiente de la tabla "jid" (_id) en "jid_row_id". +' - el renglon correspondiente de la tabla "messages" (_id) en "display_message_row_id". +' - y mas columnas ... + + 'Revisamos que exista el numero al que vamos a mandar el mensaje en la tabla "jid". + Private jids As String = hazRootQuery($"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'select _id from jid where user = "${destinatario}" limit 1';"$, "getNumber") +' Log($"|${jids.trim}|"$) + If jids.Trim = "" Then 'Si no existe, entonces lo insertamos. + If Starter.logger Then LogColor("No hay JID, lo insertamos", Colors.Red) + Private sqlInsertJid As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'INSERT INTO jid (user, server, Agent, Type, raw_string, device) VALUES ("${destinatario}", "s.whatsapp.net", 0, 0, "${jid}", 0)';"$ + hazRootQuery(sqlInsertJid, "InsertJid") 'Insertamos el numero en la tabla "jid". + End If + 'Traemos el jid insertado. + Private elJid As String = hazRootQuery($"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'SELECT _id FROM jid where user = "${destinatario}" limit 1';"$, "GetJid") + elJid = elJid.trim +' Log("****** "&elJid) + +' ******************************************************************************************* +' Agregamos el mensaje a la tabla "messages". +' ******************************************************************************************* + Private suCmd As String = $"sqlite3 /data/data/com.whatsapp/databases/msgstore.db 'INSERT INTO messages (key_remote_jid,key_from_me,key_id,status,needs_push,data,timestamp,media_url,media_mime_type,media_wa_type,media_size,media_name,media_hash,latitude,longitude,thumb_image,remote_resource,received_timestamp,send_timestamp,receipt_server_timestamp,receipt_device_timestamp,raw_data,recipient_count,media_duration,origin) VALUES ("${jid}", 1, "${key_id}",0,0,"${mensaje}",${key_id},"","",0,0,"","",0,0,"","",${received_timestamp},-1,-1,-1,"",0,0,0)';"$ + +' Private suCmd As String = $"sqlite3 /data/data/com.gbwhatsapp/databases/msgstore.db 'SELECT _id, key_remote_jid, data FROM messages WHERE data like "Test%"';"$ + Runner = File.Combine(File.DirInternalCache, "runner") + Command = File.Combine(File.DirInternalCache, "command") + File.WriteString(File.DirInternalCache, "runner", "su < " & Command) + File.WriteString(File.DirInternalCache, "command", suCmd & CRLF & "exit") 'Any commands via crlf, and exit at end + Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr) +' Log(Result) + If Result = 0 Then ToastMessageShow("Mensaje enviado", False) + + 'Traemos el id del ultimo mensaje de la tabla "messages". + Private lastMsgId As Int = hazRootQuery($"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'SELECT max(_id) FROM messages';"$, "GetLastMsgId") +' Log(lastMsgId) + + 'Revisamos si existe el jid en la tabla "chat". + Private chatJid As String = hazRootQuery($"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'select count(jid_row_id) from chat where jid_row_id = "${elJid}"';"$, "getChatJid") +' Log($"|${chatJid.trim}|"$) + + If chatJid.Trim > 0 Then 'Actualizamos los datos necesarios en la tabla "chat". + Private sqlUpdateChat As String = hazRootQuery($"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'update chat set hidden = 0, display_message_row_id = ${lastMsgId}, last_message_row_id = ${lastMsgId}, last_read_message_row_id = ${lastMsgId}, last_read_receipt_sent_message_row_id = ${(lastMsgId-1)}, last_important_message_row_id = 1, archived = 0, sort_timestamp = ${DateTime.Now} where jid_row_id = ${elJid}';"$, "updateChat") +' Log("Actualizamos en CHAT") + Else 'Insertamos los datos necesarios a la tabla "chat" + Private sqlInsertChat As String = hazRootQuery($"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'insert into chat + (jid_row_id, hidden, display_message_row_id, last_message_row_id, last_read_message_row_id, last_read_receipt_sent_message_row_id, last_important_message_row_id, archived, sort_timestamp, mod_tag, spam_detection, unseen_earliest_message_received_time, unseen_message_count, unseen_missed_calls_count, unseen_row_count, plaintext_disabled, vcard_ui_dismissed, change_number_notified_message_row_id, show_group_description, ephemeral_expiration, ephemeral_setting_timestamp, unseen_important_message_count, ephemeral_disappearing_messages_initiator, group_type, last_message_reaction_row_id, last_seen_message_reaction_row_id, unseen_message_reaction_count, last_read_message_sort_id, display_message_sort_id, last_message_sort_id, last_read_receipt_sent_message_sort_id) + values (${elJid}, 0, ${lastMsgId}, ${lastMsgId}, ${lastMsgId}, ${(lastMsgId-1)}, 1, 0, ${DateTime.Now}, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ${lastMsgId}, ${lastMsgId}, ${lastMsgId}, ${(lastMsgId-1)})';"$, "insertChat") +' Log("Insertamos en CHAT") + End If + + 'Obtenemos el id del ultimo mensaje +' Private suCmd1 As String = $"sqlite3 /data/data/com.whatsapp/databases/msgstore.db 'SELECT max(_id) FROM messages';"$ +' Dim nextId As Int = hazRootQuery(suCmd1, "GetId") +' Log("Last ID="&nextId) +' 'Insertamos un boton +' Private suCmd As String = $"sqlite3 /data/data/com.whatsapp/databases/msgstore.db 'INSERT INTO message_template_button (message_row_id, text_data, extra_data, button_type, used) VALUES ("${nextId}", "Boton de Prueba", "Boton de prueba", 0, 1)';"$ +' hazRootQuery(suCmd, "guardaBoton") + + Private suCmd As String = $"killall com.whatsapp"$ + Runner = File.Combine(File.DirInternalCache, "runner") + Command = File.Combine(File.DirInternalCache, "command") + File.WriteString(File.DirInternalCache, "runner", "su < " & Command) + File.WriteString(File.DirInternalCache, "command", suCmd & CRLF & "exit") 'Any commands via crlf, and exit at end + Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr) + If Starter.logger Then Log("Kill WA result : " & Result) + If Starter.logger Then LogColor(StdOut.tostring, Colors.red) + +' hazRootQuery("killall com.whatsapp", "Kill_WA") +End Sub + +'Manda un mensaje con imagen al número especificado (52155XXXXXXXX) mediante un script de shell y root. +'El celular necesita estar rooteado. +Sub mandaWAImageRoot_0(m As String) 'ignore + Starter.waDb.Initialize("/sdcard/", "msgstore_no_enviado.db", True) + Dim waPackage, Command, Runner As String + Dim StdOut, StdErr, StdOut2, StdErr2 As StringBuilder + StdOut.Initialize + StdErr.Initialize + StdOut2.Initialize + StdErr2.Initialize + waPackage = Starter.waPackage + Dim Result As Int + Dim Ph As Phone +' Private suCmd As String = $"sqlite3 /data/data/com.whatsapp/databases/msgstore.db 'SELECT _id, key_remote_jid, data FROM messages WHERE data like "Test%"';"$ + Private jid As String = "5215554192439@s.whatsapp.net" + Private key_id As String = $"${DateTime.Now}-1"$ + Private timeStamp As Int = DateTime.Now +' Private mensaje As String = $"/msjTest ${m} ${DateTime.Time(DateTime.Now)}"$ +' Private received_timestamp As String = "0" + Private keyId As String = "" + If Starter.logger Then Log(key_id) + + Private suCmd3 As String = $"killall ${waPackage}"$ + Runner = File.Combine(File.DirInternalCache, "runner") + Command = File.Combine(File.DirInternalCache, "command") + File.WriteString(File.DirInternalCache, "runner", "su < " & Command) + File.WriteString(File.DirInternalCache, "command", suCmd3 & CRLF & "exit") 'Any commands via crlf, and exit at end + Result = Ph.Shell("sh", Array As String(Runner), StdOut2, StdErr2) + If Starter.logger Then Log(Result) + If Result = 0 Then Log("process killed") + If Starter.logger Then LogColor(StdOut2.tostring, Colors.red) + If Starter.logger Then Log(StdOut2) + If Starter.logger Then LogColor(StdErr2, Colors.Magenta) + + Private suCmd1 As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'Select chat._id as chatId FROM chat JOIN jid ON jid._id = chat.jid_row_id where jid.raw_string = "5215554192439@s.whatsapp.net" limit 1';"$ + Private chatId As String = hazRootQuery(suCmd1, "getChatId") + + Private mediaCaption As String = "Alo Papagena … Tore bella com la papaia" + +' suCmd1 = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'Select messages.* from messages join message_media on messages._id = message_media.message_row_id order by _id desc limit 1';"$ +' Log(hazRootQuery(suCmd1, "GetMsj")) + + Dim c As Cursor = Starter.waDb.ExecQuery("Select messages.* from messages join message_media on messages._id = message_media.message_row_id order by _id desc limit 1") 'El ultimo mensaje que tenga imagen + If c.RowCount > 0 Then + c.Position = 0 + keyId = c.GetString("key_id") + Private suCmd1 As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'INSERT INTO messages (key_remote_jid, key_from_me, key_id, status, needs_push, timestamp, media_wa_type, media_size, media_name, media_caption, media_hash, media_duration,origin, latitude, longitude, received_timestamp, send_timestamp, receipt_server_timestamp, receipt_device_timestamp, recipient_count, quoted_row_id, edit_version, media_enc_hash, forwarded, preview_type, lookup_tables, future_message_type, message_add_on_flags) VALUES ("${jid}", ${c.GetInt("key_from_me")}, "${key_id}", 0, ${c.GetInt("needs_push")}, ${timeStamp}, "${c.GetString("media_wa_type")}", ${c.GetInt("media_size")}, "${c.GetString("media_name")}", "${mediaCaption}", "${c.GetString("media_hash")}", ${c.GetInt("media_duration")}, ${c.GetInt("origin")}, ${c.GetDouble("latitude")}, ${c.GetDouble("longitude")}, ${c.GetInt("received_timestamp")}, ${c.GetInt("send_timestamp")}, -1, -1, ${c.GetInt("recipient_count")}, ${c.GetInt("quoted_row_id")}, ${c.GetInt("edit_version")}, "${c.GetString("media_enc_hash")}", ${c.GetInt("forwarded")}, ${c.GetInt("preview_type")}, ${c.GetInt("lookup_tables")}, ${c.GetInt("future_message_type")}, ${c.GetInt("message_add_on_flags")})';"$ + hazRootQuery(suCmd1, "Messages") 'Insertamos los datos en la tabla "messages". + Private msgId As Int = c.GetInt("_id") + End If + c.Close + + Private suCmd1 As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'SELECT max(_id) FROM messages';"$ + Dim nextId As Int = hazRootQuery(suCmd1, "GetId") + + Dim c As Cursor = Starter.waDb.ExecQuery($"select * from message_media where message_row_id = '${msgId}'"$) + If c.RowCount > 0 Then + c.Position = 0 + Private filePath As String = c.GetString("file_path") + Private suCmd2 As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'insert into message_media (message_row_id, chat_row_id, autotransfer_retry_enabled, media_job_uuid, transferred, transcoded, file_path, file_size, suspicious_content, trim_from, trim_to, face_x, face_y, media_key_timestamp, width, height, has_streaming_sidecar, gif_attribution, thumbnail_height_width_ratio, first_scan_length, file_length, media_name, file_hash, media_duration, page_count, enc_file_hash, is_animated_sticker, mute_video) values (${nextId}, ${chatId}, 1, "${c.getString("media_job_uuid")}", 0, ${c.getInt("transcoded")}, "${filePath}", ${c.getInt("file_size")}, ${c.getInt("suspicious_content")}, ${c.getInt("trim_from")}, ${c.getInt("trim_to")}, ${c.getInt("face_x")}, ${c.getInt("face_y")}, ${c.getInt("media_key_timestamp")}, ${c.getInt("width")}, ${c.getInt("height")}, ${c.getInt("has_streaming_sidecar")}, ${c.getInt("gif_attribution")}, ${c.GetDouble("thumbnail_height_width_ratio")}, ${c.getInt("first_scan_length")}, ${c.getInt("file_length")}, "${c.getString("media_name")}", "${c.getString("file_hash")}", ${c.getInt("media_duration")}, ${c.getInt("page_count")}, "${c.getString("enc_file_hash")}", ${c.getInt("is_animated_sticker")}, ${c.getInt("mute_video")})';"$ + If Starter.logger Then Log(hazRootQuery(suCmd2, "MsgMedia")) +' If Result = 0 Then Log("inserted --> message_media") + End If + c.Close + +' Log($"readfile(${filePath}), ${timeStamp}, ${jid}, 1, ${keyId}"$) + Private suCmd2 As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'insert into message_thumbnails (thumbnail, timestamp, key_remote_jid, key_from_me, key_id) values (readfile("${filePath}"), ${timeStamp}, "${jid}", 1, "${key_id}")';"$ + If Starter.logger Then Log(hazRootQuery(suCmd2, "msgThumbnails")) +End Sub + +Sub hazRootQuery(qryStr As String, name As String) As StringBuilder +' Starter.waDb.Initialize("/sdcard/", "msgstore_no_enviado.db", True) + Dim Command, Runner As String + Dim StdOut, StdErr As StringBuilder + StdOut.Initialize + StdErr.Initialize + Dim Result As Int + Dim Ph As Phone + Runner = File.Combine(File.DirInternalCache, "runner") + Command = File.Combine(File.DirInternalCache, "command") + File.WriteString(File.DirInternalCache, "runner", "su < " & Command) + File.WriteString(File.DirInternalCache, "command", qryStr & CRLF & "exit") 'Any commands via crlf, and exit at end + Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr) +' Log(name&" "&"Res="&Result) +' Log(StdOut) + If Starter.logger Then LogColor(StdErr, Colors.red) + If StdErr.Length > 1 Then LogColor(qryStr, Colors.Blue) + Return StdOut +End Sub + +Sub copyWADB 'ignore + Dim waPackage, Command, Runner As String + Dim StdOut, StdErr As StringBuilder + StdOut.Initialize + StdErr.Initialize + waPackage = Starter.waPackage + Dim Result As Int + Dim Ph As Phone + + Private suCmd3 As String = $"killall ${waPackage}"$ + Runner = File.Combine(File.DirInternalCache, "runner") + Command = File.Combine(File.DirInternalCache, "command") + File.WriteString(File.DirInternalCache, "runner", "su < " & Command) + File.WriteString(File.DirInternalCache, "command", suCmd3 & CRLF & "exit") 'Any commands via crlf, and exit at end + Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr) + If Starter.logger Then Log(Result) + If Result = 0 Then Log("process killed") + If Starter.logger Then LogColor(StdOut.tostring, Colors.red) + If Starter.logger Then Log(StdOut) + If Starter.logger Then LogColor(StdErr, Colors.Magenta) + + Private suCmd As String = $"sqlite3 /data/user/0/${waPackage}/databases/msgstore.db 'PRAGMA wal_checkpoint;' + cp /data/data/${waPackage}/databases/msgstore.db /sdcard/msgstore.db"$ + If Starter.logger Then LogColor(suCmd, Colors.Blue) + Runner = File.Combine(File.DirInternalCache, "runner") + Command = File.Combine(File.DirInternalCache, "command") + File.WriteString(File.DirInternalCache, "runner", "su < " & Command) + File.WriteString(File.DirInternalCache, "command", suCmd & CRLF & "exit") 'Any commands via crlf, and exit at end + Result = Ph.Shell("sh", Array As String(Runner), StdOut, StdErr) + If Starter.logger Then Log(Result) + If Starter.logger Then Log(StdOut) + If Starter.logger Then LogColor(StdErr, Colors.Magenta) + If Result = 0 Then Log("copied db") +End Sub + +'Regresa una lista de mapas con los datos con los ultimos mensajes con imagen enviados. +'Con este mapa se puede generar un nuevo mensaje con imagen. +Sub traeImgMsjData As List + Private regs As List + regs.Initialize + Private sqlSync As String = $"sqlite3 /data/user/0/${Starter.waPackage}/databases/msgstore.db 'PRAGMA wal_checkpoint;'"$ + Private sync As String = hazRootQuery(sqlSync, "syncDB") 'Guardamos los datos en la DB 'ignore +' Private suCmd2 As String = $"sqlite3 /data/data/${Starter.waPackage}/databases/msgstore.db 'select * from messages join message_media on message_row_id = _id limit 20';"$ + Private suCmd2 As String = $"sqlite3 /data/data/${Starter.waPackage}/databases/msgstore.db 'select _id, key_remote_jid, key_from_me, key_id, status, needs_push, timestamp, media_url, media_mime_type, media_wa_type, media_size, messages.media_name, media_caption, media_hash, messages.media_duration, origin, latitude, longitude, remote_resource, received_timestamp, send_timestamp, receipt_server_timestamp, receipt_device_timestamp, read_device_timestamp, played_device_timestamp, raw_data, recipient_count, participant_hash, starred, quoted_row_id, mentioned_jids, messages.multicast_id, edit_version, media_enc_hash, payment_transaction_id, forwarded, preview_type, send_count, lookup_tables, future_message_type, message_add_on_flags, message_row_id, chat_row_id, autotransfer_retry_enabled, message_media.multicast_id, media_job_uuid, transferred, transcoded, file_path, file_size, suspicious_content, trim_from, trim_to, face_x, face_y, media_key_timestamp, width, height, has_streaming_sidecar, gif_attribution, thumbnail_height_width_ratio, direct_path, first_scan_sidecar, first_scan_length, message_url, mime_type, file_length, message_media.media_name, file_hash, message_media.media_duration, page_count, enc_file_hash, partial_media_hash, partial_media_enc_hash, is_animated_sticker, original_file_hash, mute_video from messages join message_media on message_row_id = _id limit 20';"$ + Private tempData As String = hazRootQuery(suCmd2, "traeImgMsjData").As(StringBuilder).ToString + Private renglon() As String = Regex.Split(CRLF, tempData) +' Log("======= _"&renglon.Length&"_|"&tempData) + For i = 0 To renglon.Length -1 +' LogColor($"i=${i}, ${renglon(i)}"$, Colors.Blue) + Private columna() As String = Regex.Split("\|", renglon(i)) +' For col = 0 To columna.Length - 1 +' Log($"col=${col}, ${columna(col)}"$) +' Next + If columna.Length > 47 Then + Private theDir As String = Starter.waDir & "/" &columna(48) +' Log(theDir) + If theDir.EndsWith("jpg") Or theDir.EndsWith("png") Then + If File.Exists(theDir.SubString2(0, theDir.LastIndexOf("/")+1), theDir.SubString(theDir.LastIndexOf("/")+1)) Then + Private msjData As Map = CreateMap("_id":columna(0), "key_remote_jid":columna(1), "key_from_me":columna(2), "key_id":columna(3), "status":columna(4), "needs_push":columna(5), "timestamp":columna(6), "media_url":columna(7), "media_mime_type":columna(8), "media_wa_type":columna(9), "media_size":columna(10), "media_name":columna(11), "media_caption":columna(12), "media_hash":columna(13), "media_duration":columna(14), "origin":columna(15), "latitude":columna(16), "longitude":columna(17), "remote_resource":columna(18), "received_timestamp":columna(19), "send_timestamp":columna(20), "receipt_server_timestamp":columna(21), "receipt_device_timestamp":columna(22), "read_device_timestamp":columna(23), "played_device_timestamp":columna(24), "raw_data":columna(25), "recipient_count":columna(26), "participant_hash":columna(27), "starred":columna(28), "quoted_row_id":columna(29), "mentioned_jids":columna(30), "multicast_id":columna(31), "edit_version":columna(32), "media_enc_hash":columna(33), "payment_transaction_id":columna(34), "forwarded":columna(35), "preview_type":columna(36), "send_count":columna(37), "lookup_tables":columna(38), "future_message_type":columna(39), "message_add_on_flags":columna(40)) + Private imgData As Map = CreateMap("message_row_id":columna(41), "chat_row_id":columna(42), "autotransfer_retry_enabled":columna(43), "multicast_id":columna(44), "media_job_uuid":columna(45), "transferred":columna(46), "transcoded":columna(47), "file_path":columna(48), "file_size":columna(49), "suspicious_content":columna(50), "trim_from":columna(51), "trim_to":columna(52), "face_x":columna(53), "face_y":columna(54), "media_key_timestamp":columna(55), "width":columna(56), "height":columna(57), "has_streaming_sidecar":columna(58), "gif_attribution":columna(59), "thumbnail_height_width_ratio":columna(60), "direct_path":columna(61), "first_scan_sidecar":columna(62), "first_scan_length":columna(63), "message_url":columna(64), "mime_type":columna(65), "file_length":columna(66), "media_name":columna(67), "file_hash":columna(68), "media_duration":columna(69), "page_count":columna(70), "enc_file_hash":columna(71), "partial_media_hash":columna(72), "partial_media_enc_hash":columna(73), "is_animated_sticker":columna(74), "original_file_hash":columna(75), "mute_video":columna(76)) + Private thisReg As Map = CreateMap("msjData":msjData, "imgData":imgData) +' LogColor("Agregamos registro "& i, Colors.Magenta) + regs.Add(thisReg) + End If + End If + End If + Next +' Log(regs) +' Log("Registros="®s.Size) +' For x = 0 To regs.Size-1 +' Log(regs.Get(x)) +' Next + Return regs +End Sub + +'Manda un mensaje con imagen al número especificado (52155XXXXXXXX) mediante un script de shell y root. +'El celular necesita estar rooteado. +Sub mandaWAImageRoot(jid As String, texto As String, msjMap As Map) 'ignore + Starter.waDb.Initialize("/sdcard/", "msgstore_no_enviado.db", True) + jid = "5215554192439@s.whatsapp.net" + Private mediaCaption As String = "Alo Papagena … Tore bella com la papaia" + Private filePath As String = "/storage/F3DF-3FB8/Bow2.0/qr.jpg" + If texto <> "" And texto <> Null Then mediaCaption = texto + Dim waPackage As String = Starter.waPackage + Private key_id As String = $"${DateTime.Now}-1"$ + Private timeStamp As String = DateTime.Now + Private keyId As String = "" + If Starter.logger Then Log($"jid=${jid}, timeStamp=${timeStamp}, key_Id=${key_id}, now=${DateTime.Now}"$) + If Starter.logger Then LogColor(msjMap, Colors.Blue) + '============================== Kill Process ============================== + Private killWA As String = hazRootQuery($"killall ${waPackage}"$, "killWA") 'Matamos el proceso de WA 'ignore + '============================================================ + Private sqlGetChatId As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'Select chat._id as chatId FROM chat JOIN jid ON jid._id = chat.jid_row_id where jid.raw_string = "${jid}" limit 1';"$ + Private chatId As String = hazRootQuery(sqlGetChatId, "getChatId") 'Obtenenos el ID del chat del JID proporcionado. + +' Dim c As Cursor = Starter.waDb.ExecQuery("Select messages.* from messages join message_media on messages._id = message_media.message_row_id order by _id desc limit 1") 'El ultimo mensaje que tenga imagen +' If c.RowCount > 0 Then +' c.Position = 0 + '=============================== Insert into Messages ============================== + Private msjInfo As Map = msjMap.Get("msjData") + keyId = msjInfo.Get("key_id") + Private sqlInsertMsg As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'INSERT INTO messages (key_remote_jid, key_from_me, key_id, status, needs_push, timestamp, media_wa_type, media_size, media_name, media_caption, media_hash, media_duration, origin, latitude, longitude, received_timestamp, send_timestamp, receipt_server_timestamp, receipt_device_timestamp, recipient_count, quoted_row_id, edit_version, media_enc_hash, forwarded, preview_type, lookup_tables, future_message_type, message_add_on_flags) VALUES ("${jid}", ${msjInfo.Get("key_from_me")}, "${key_id}", 0, ${msjInfo.Get("needs_push")}, ${timeStamp}, "${msjInfo.Get("media_wa_type")}", ${msjInfo.Get("media_size")}, "${msjInfo.Get("media_name")}", "${mediaCaption}", "${msjInfo.Get("media_hash")}", ${msjInfo.Get("media_duration")}, ${msjInfo.Get("origin")}, ${msjInfo.Get("latitude")}, ${msjInfo.Get("longitude")}, ${msjInfo.Get("received_timestamp")}, ${msjInfo.Get("send_timestamp")}, -1, -1, ${msjInfo.Get("recipient_count")}, ${msjInfo.Get("quoted_row_id")}, ${msjInfo.Get("edit_version")}, "${msjInfo.Get("media_enc_hash")}", ${msjInfo.Get("forwarded")}, ${msjInfo.Get("preview_type")}, ${msjInfo.Get("lookup_tables")}, ${msjInfo.Get("future_message_type")}, ${msjInfo.Get("message_add_on_flags")})';"$ + If Starter.logger Then LogColor(sqlInsertMsg, Colors.Magenta) + hazRootQuery(sqlInsertMsg, "InsertMessage") 'Insertamos los datos en la tabla "messages". +' Private msgId As Int = msjInfo.Get("_id") +' End If +' c.Close + '=============================== Get last Id ============================= + Private sqlGetLastMsgId As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'SELECT max(_id) FROM messages';"$ + Dim nextId As Int = hazRootQuery(sqlGetLastMsgId, "GetLastId") + Starter.reglasDB.ExecNonQuery($"INSERT INTO datosMsj (_id, key_remote_jid, key_from_me, key_id, status, needs_push, timestamp, media_wa_type, media_size, media_name, media_caption, media_hash, media_duration, origin, latitude, longitude, received_timestamp, send_timestamp, receipt_server_timestamp, receipt_device_timestamp, recipient_count, quoted_row_id, edit_version, media_enc_hash, forwarded, preview_type, lookup_tables, future_message_type, message_add_on_flags) VALUES ("${nextId}", "${jid}", ${msjInfo.Get("key_from_me")}, "${key_id}", 0, ${msjInfo.Get("needs_push")}, ${timeStamp}, "${msjInfo.Get("media_wa_type")}", ${msjInfo.Get("media_size")}, "${msjInfo.Get("media_name")}", "${mediaCaption}", "${msjInfo.Get("media_hash")}", ${msjInfo.Get("media_duration")}, ${msjInfo.Get("origin")}, ${msjInfo.Get("latitude")}, ${msjInfo.Get("longitude")}, ${msjInfo.Get("received_timestamp")}, ${msjInfo.Get("send_timestamp")}, -1, -1, ${msjInfo.Get("recipient_count")}, ${msjInfo.Get("quoted_row_id")}, ${msjInfo.Get("edit_version")}, "${msjInfo.Get("media_enc_hash")}", ${msjInfo.Get("forwarded")}, ${msjInfo.Get("preview_type")}, ${msjInfo.Get("lookup_tables")}, ${msjInfo.Get("future_message_type")}, ${msjInfo.Get("message_add_on_flags")})"$) + +' Dim c As Cursor = Starter.waDb.ExecQuery($"select * from message_media where message_row_id = '${msgId}'"$) +' If c.RowCount > 0 Then +' c.Position = 0 + '=============================== Insert into message_media ============================ + Private imgInfo As Map = msjMap.Get("imgData") + + Private theDir As String = Starter.waDir & "/" & imgInfo.get("file_path") + If Starter.logger Then Log("file_path="&imgInfo.get("file_path")) + If Starter.logger Then Log($"ImgDir=${theDir}"$) + If File.Exists(theDir.SubString2(0, theDir.LastIndexOf("/")+1), theDir.SubString(theDir.LastIndexOf("/")+1)) Then + File.Copy(theDir.SubString2(0, theDir.LastIndexOf("/")+1), theDir.SubString(theDir.LastIndexOf("/")+1), "/sdcard/Bow2.0/", theDir.SubString(theDir.LastIndexOf("/")+1)) + filePath = "/sdcard/Bow2.0/" & theDir.SubString(theDir.LastIndexOf("/")+1) + End If + If Starter.logger Then LogColor($"filePath=${filePath}"$, Colors.Magenta) + Private sqlInsertMedia As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'insert into message_media (message_row_id, chat_row_id, autotransfer_retry_enabled, media_job_uuid, transferred, transcoded, file_path, file_size, suspicious_content, trim_from, trim_to, face_x, face_y, media_key_timestamp, width, height, has_streaming_sidecar, gif_attribution, thumbnail_height_width_ratio, first_scan_length, file_length, media_name, file_hash, media_duration, page_count, enc_file_hash, is_animated_sticker, mute_video) values (${nextId}, ${chatId}, 1, "abcd${imgInfo.get("media_job_uuid").As(String).SubString(4)}", 0, ${imgInfo.get("transcoded")}, "${filePath}", ${imgInfo.get("file_size")}, ${imgInfo.get("suspicious_content")}, ${imgInfo.get("trim_from")}, ${imgInfo.get("trim_to")}, ${imgInfo.get("face_x")}, ${imgInfo.get("face_y")}, ${imgInfo.get("media_key_timestamp")}, ${imgInfo.get("width")}, ${imgInfo.get("height")}, ${imgInfo.get("has_streaming_sidecar")}, ${imgInfo.get("gif_attribution")}, ${imgInfo.get("thumbnail_height_width_ratio")}, ${imgInfo.get("first_scan_length")}, ${imgInfo.get("file_length")}, "${imgInfo.get("media_name")}", "${imgInfo.get("file_hash")}", ${imgInfo.get("media_duration")}, ${imgInfo.get("page_count")}, "${imgInfo.get("enc_file_hash")}", ${imgInfo.get("is_animated_sticker")}, ${imgInfo.get("mute_video")})';"$ + If Starter.logger Then LogColor(sqlInsertMedia, Colors.Magenta) + If Starter.logger Then Log(hazRootQuery(sqlInsertMedia, "MsgMedia")) + Starter.reglasDB.ExecNonQuery($"insert into datosImg (message_row_id, chat_row_id, autotransfer_retry_enabled, media_job_uuid, transferred, transcoded, file_path, file_size, suspicious_content, trim_from, trim_to, face_x, face_y, media_key_timestamp, width, height, has_streaming_sidecar, gif_attribution, thumbnail_height_width_ratio, first_scan_length, file_length, media_name, file_hash, media_duration, page_count, enc_file_hash, is_animated_sticker, mute_video) values (${nextId}, ${chatId}, 1, "abcd${imgInfo.get("media_job_uuid").As(String).SubString(4)}", 0, ${imgInfo.get("transcoded")}, "${filePath}", ${imgInfo.get("file_size")}, ${imgInfo.get("suspicious_content")}, ${imgInfo.get("trim_from")}, ${imgInfo.get("trim_to")}, ${imgInfo.get("face_x")}, ${imgInfo.get("face_y")}, ${imgInfo.get("media_key_timestamp")}, ${imgInfo.get("width")}, ${imgInfo.get("height")}, ${imgInfo.get("has_streaming_sidecar")}, ${imgInfo.get("gif_attribution")}, ${imgInfo.get("thumbnail_height_width_ratio")}, ${imgInfo.get("first_scan_length")}, ${imgInfo.get("file_length")}, "${imgInfo.get("media_name")}", "${imgInfo.get("file_hash")}", ${imgInfo.get("media_duration")}, ${imgInfo.get("page_count")}, "${imgInfo.get("enc_file_hash")}", ${imgInfo.get("is_animated_sticker")}, ${imgInfo.get("mute_video")})"$) +' If Result = 0 Then Log("inserted --> message_media") +' End If +' c.Close + '=============================== Insert into message_thumbnails ============================ + Private sqlInsertThumb As String = $"sqlite3 /data/data/${waPackage}/databases/msgstore.db 'insert into message_thumbnails (thumbnail, timestamp, key_remote_jid, key_from_me, key_id) values (readfile("${filePath}"), ${timeStamp}, "${jid}", 1, "${key_id}")';"$ + If Starter.logger Then LogColor(sqlInsertThumb, Colors.Magenta) + If Starter.logger Then Log(hazRootQuery(sqlInsertThumb, "msgThumbnails")) +End Sub \ No newline at end of file diff --git a/B4A/cvFloatingBtn.bas b/B4A/cvFloatingBtn.bas new file mode 100644 index 0000000..fb1f7be --- /dev/null +++ b/B4A/cvFloatingBtn.bas @@ -0,0 +1,89 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Class +Version=10.5 +@EndOfDesignText@ +'Custom View class +#Event: ExampleEvent (Value As Int) +'#DesignerProperty: Key: Width, DisplayName: Width, FieldType: int, DefaultValue: 55, Description: Width of button. +'#DesignerProperty: Key: Height, DisplayName: Height, FieldType: int, DefaultValue: 55, Description: Height of button. +#DesignerProperty: Key: ImageFile, DisplayName: Image File, FieldType: String, DefaultValue: , Description: Image for button. +'#DesignerProperty: Key: BooleanExample, DisplayName: Boolean Example, FieldType: Boolean, DefaultValue: True, Description: Example of a boolean property. +'#DesignerProperty: Key: IntExample, DisplayName: Int Example, FieldType: Int, DefaultValue: 10, MinRange: 0, MaxRange: 100, Description: Note that MinRange and MaxRange are optional. +'#DesignerProperty: Key: StringWithListExample, DisplayName: String With List, FieldType: String, DefaultValue: Sunday, List: Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday +'#DesignerProperty: Key: StringExample, DisplayName: String Example, FieldType: String, DefaultValue: Text +'#DesignerProperty: Key: ColorExample, DisplayName: Color Example, FieldType: Color, DefaultValue: 0xFFCFDCDC, Description: You can use the built-in color picker to find the color values. +'#DesignerProperty: Key: DefaultColorExample, DisplayName: Default Color Example, FieldType: Color, DefaultValue: Null, Description: Setting the default value to Null means that a nullable field will be displayed. +Sub Class_Globals + Private mEventName As String 'ignore + Private mCallBack As Object 'ignore + Private mBase As Panel + Private Const DefaultColorConstant As Int = -984833 'ignore + Private Const ACTION_DOWN=0,ACTION_UP=1 As Int + Private downx, downy As Float 'ignore + Private S1,S2,Diff As Long +End Sub + +Public Sub Initialize (Callback As Object, EventName As String) + mEventName = EventName + mCallBack = Callback +End Sub + +Public Sub DesignerCreateView (Base As Panel, Lbl As Label, Props As Map) + mBase = Base + Private ImgFl As String + ImgFl = Props.Get("ImageFile") + + If ImgFl <> "" Then mBase.SetBackgroundImage(LoadBitmap(File.DirAssets,ImgFl)) + + SetOnTouchListener(mBase) +End Sub + +Public Sub GetBase As Panel + Return mBase +End Sub + +Public Sub setLeft(Left As Int) + mBase.Left = Left +End Sub + +Public Sub setTop(Top As Int) + mBase.Top = Top +End Sub + +Public Sub setVisible(Flag As Boolean) + mBase.Visible = Flag +End Sub + +Private Sub SetOnTouchListener(MyView As View) + Dim ref As Reflector + ref.Target = MyView + ref.SetOnTouchListener("Panel_Touch") +End Sub + +Private Sub Panel_Touch(ViewTag As Object, Action As Int, X As Float, Y As Float, MotionEvent As Object) As Boolean + If Action = ACTION_DOWN Then + downx = x + downy = y + S1 = DateTime.Now + else If Action = ACTION_UP Then + S2 = DateTime.Now + Diff = S2 - S1 + If Diff <= 199 Then + If SubExists(mCallBack,mEventName.Trim & "_Clicked") Then CallSub3(mCallBack,mEventName.Trim & "_Clicked",X,Y) + End If + Else +' Log(mBase.left& " + " & x & " - " & downx) + If mBase.Left >= 14 And mBase.Left <= 900 Then mBase.Left = mBase.Left + x - downx + If mBase.Left < 14 And (X-downx) > 0 Then mBase.Left = mBase.Left + x - downx +' If mBase.Left < 900 Then mBase.Left = mBase.Left + x - downx + If mBase.Left > 900 And (X-downx) < 0 Then mBase.Left = mBase.Left + x - downx +' mBase.Top = mBase.Top + y - downy + mBase.Left = mBase.Left + If mBase.Left < 10 Then mBase.Left = 14 'ignore + If mBase.Left > 910 Then mBase.Left = 900 'ignore +' mBase.Top = mBase.Top + End If + Return True +End Sub \ No newline at end of file diff --git a/B4A/reglas.bas b/B4A/reglas.bas new file mode 100644 index 0000000..f737359 --- /dev/null +++ b/B4A/reglas.bas @@ -0,0 +1,13 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=StaticCode +Version=11.45 +@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. + +End Sub \ No newline at end of file diff --git a/B4A/startWA.bas b/B4A/startWA.bas new file mode 100644 index 0000000..78e0ab2 --- /dev/null +++ b/B4A/startWA.bas @@ -0,0 +1,44 @@ +B4A=true +Group=Default Group +ModulesStructureVersion=1 +Type=Activity +Version=11.5 +@EndOfDesignText@ +#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 OldIntent As Intent +End Sub + +Sub Globals + 'These global variables will be redeclared each time the activity is created. + 'These variables can only be accessed from this module. + +End Sub + +Sub Activity_Create(FirstTime As Boolean) + 'Do not forget to load the layout file created with the visual designer. For example: + 'Activity.LoadLayout("Layout1") + +End Sub + +Sub Activity_Resume + Dim in As Intent = B4XPages.GetNativeParent(Me).GetStartingIntent + If in.IsInitialized And in <> OldIntent Then + OldIntent = in + If in.HasExtra("Notification_Tag") Then + Log("Activity started from notification. Tag: " & in.GetExtra("Notification_Tag")) + Starter.historicoDB.ExecNonQuery2("update historico set clic = 1 where clic = 0 and nombre = ?", Array As Object(in.GetExtra("Notification_Tag"))) 'Ponemos en 1 las notificacion a las que ya se les dió clic. + Subs.abreWAChat(in.GetExtra("Notification_Tag")) + End If + End If +End Sub + +Sub Activity_Pause (UserClosed As Boolean) + +End Sub diff --git a/B4i/B4iProject.b4i b/B4i/B4iProject.b4i new file mode 100644 index 0000000..89d3164 --- /dev/null +++ b/B4i/B4iProject.b4i @@ -0,0 +1,53 @@ +Build1=Default,b4i.example2 +File1=Login.bil +File2=Page2.bil +File3=Page3.bil +FileGroup1=Default Group +FileGroup2=Default Group +FileGroup3=Default Group +Group=Default Group +Library1=icore +Library2=b4xpages +Library3=xui views +Module1=|relative|..\B4XMainPage +Module2=|relative|..\B4XPage2 +Module3=|relative|..\B4XPage3 +NumberOfFiles=3 +NumberOfLibraries=3 +NumberOfModules=3 +Version=6.5 +@EndOfDesignText@ +'Code module +#Region Project Attributes + #ApplicationLabel: B4i Example + #Version: 1.0.0 + 'Orientation possible values: Portrait, LandscapeLeft, LandscapeRight and PortraitUpsideDown + #iPhoneOrientations: Portrait, LandscapeLeft, LandscapeRight + #iPadOrientations: Portrait, LandscapeLeft, LandscapeRight, PortraitUpsideDown + #Target: iPhone, iPad + #ATSEnabled: True + #MinVersion: 8 +#End Region + +Sub Process_Globals + Public App As Application + Public NavControl As NavigationController + +End Sub + +Private Sub Application_Start (Nav As NavigationController) + NavControl = Nav + Dim PagesManager As B4XPagesManager + PagesManager.Initialize(NavControl) +End Sub + +'Template version: B4i-1.0 +#Region Delegates +Private Sub Application_Background + B4XPages.Delegate.Activity_Pause +End Sub + +Private Sub Application_Foreground + B4XPages.Delegate.Activity_Resume +End Sub +#End Region diff --git a/B4i/B4iProject.b4i.meta b/B4i/B4iProject.b4i.meta new file mode 100644 index 0000000..8e4f7f7 --- /dev/null +++ b/B4i/B4iProject.b4i.meta @@ -0,0 +1,15 @@ +ModuleBookmarks0= +ModuleBookmarks1= +ModuleBookmarks2= +ModuleBookmarks3= +ModuleBreakpoints0= +ModuleBreakpoints1= +ModuleBreakpoints2= +ModuleBreakpoints3= +ModuleClosedNodes0=1 +ModuleClosedNodes1= +ModuleClosedNodes2= +ModuleClosedNodes3= +NavigationStack=B4XPage2,B4XPage_Appear,22,0,B4XMainPage,Class_Globals,0,0,B4XMainPage,txtUser_TextChanged,36,0,B4XMainPage,txtUser_EnterPressed,37,6,B4XPage2,btnSignOut_Click,39,1,Main,Application_Background,25,0,Main,Application_Foreground,34,0,B4XPage3,Class_Globals,0,0,B4XPage3,Panel1_Touch,27,0,Visual Designer,Page3.bil,-100,3,B4XPage3,B4XPage_Created,14,0 +SelectedBuild=0 +VisibleModules=1,2,3 diff --git a/B4i/Files/Special/B4X_FontAwesome.otf b/B4i/Files/Special/B4X_FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70 GIT binary patch literal 134808 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 literal 0 HcmV?d00001 diff --git a/B4i/Files/Special/B4X_MaterialIcons.ttf b/B4i/Files/Special/B4X_MaterialIcons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7015564ad166a3e9d88c82f17829f0cc01ebe29a GIT binary patch literal 128180 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 ohyj3!`#ee%L;DTjx@8!5k5~VH0QmdE^#A|> literal 0 HcmV?d00001 diff --git a/B4i/Files/login.bil b/B4i/Files/login.bil new file mode 100644 index 0000000000000000000000000000000000000000..17f5d0f0aa012a178dc691f3b4be8ab6bf02fd7a GIT binary patch literal 4613 zcmc&%OK%%h6dtFxi=m~wp*;HFQBsR;eV+GA*WO$Lr#xZ(j zSTx9kq|mtY2{iulX#2n64A;-kt=+qGrhB^Q?##U-hZnoEeRq4h{|I_|@9fED?@c96 z1p|ZYBVYZr#A32SiY z?!PX;auJPD6vBn8Rs9mQiM$G(Lf?cAosy@6zFBP)L1D}WYqkJKxz)1bTwWEHOM$=Q z+2g+J2Ru&R4{RMQIkqX2wt^qP@SL)pm5_aVrBZdg(ws7m&-2@HCXN@@!YnA;d5BBv(AiLC4l(a2_#ELzmU6;;|UI2OIqIC?w8Pt4>MWjHzJJ z37xzv$8U`<_`aKO&Jm=l3g8QhKvoU>O4X1~qe=|VIK~wpjFbLNWTF2x=nujQuTh{U z0>^$43z)o(u_>b~ZHbpB?#vVIDTHbB97W$Vo6(iQI871}m}IwZi4k!Z(WJ47$;{~4 znT5viJh0>`oC=~Bvh@{13XJ0!p|b5r18w?Xn|`!SPs?V%I_H$iroX*2(B2tr?;LIK zq#5OEL=Ek(s=!g6>1S}RE=JJ%RR+Dr+#*F~O>f+Y94VCjKx{-R7am`B?2uQne;>qy zq%hZ8H+QT1{VaAW`!cRQ(IsvRe#SAaOc%6RkP1>7a)FOxWE>s#KGNrr$o+&eiY&4q zL`Im$&!d-5I~VimD@E5=#(<%sqg_delc0&nkY1w5z68Q6Hm$GbeHGY^+ptjQc6P-z zj_Y`uXUh6s#)mg;H}~$wa88Bc8g6igo@hA)tcI3&701%&GK_^5Wd%c?FZ*kwg@Ue1 z0Hw63XsOpB-atd#UytHz#ovV3=d z@U`M^Lv+k}cPE`6?xgc~I_dmKC!P0n(s^$uo%eOp`MaHT-Vf)A*Z@NqgoxP?M;l6- z%58}E8p``r(5w#{3On&*5Icq_*i9XWkTUool#kF7@_z%o8Q;U03)*znMEg8C z3F`|;iTeVSBo0!$2t}aY$igKI3k#f!Sb%Z}?f=q|#2%r85eOYjh>dj6$tH9t3`cb2 zp$Q!YD4Sh8lCo_sVv_&Nnr(7%a};Z>_!jxkKPe>t8QjBM@VNE-r^_ZI8v)mtdI0dQ ft}X$NyPD`cI_-Hl!I{cNoVQ4OtgBxDYL@jctBKeT literal 0 HcmV?d00001 diff --git a/B4i/Files/page2.bil b/B4i/Files/page2.bil new file mode 100644 index 0000000000000000000000000000000000000000..057f4daaa800bc43b0b307d429afb66b19af2639 GIT binary patch literal 4596 zcmc&$-ES0C6rYvd>MDu~f}jHOS)kNzTNLo4--SZEg|ZYso@P6j-GSMe&FtM)OiT&} zW5NqQ)aaWgiXTtv`<U_Wl=l@r>gpb|L=Fk#wmXmi4J8*D_T zF@MOzxDRVp4D)%OGjb+JzYK&CKZLa!i@%FlTdwfbFp@?kH+SpC$@b$NH^*=7+cVvs z?Y!C1{;S`y|HhhZ_SRVHn7?!3_IK-ce(=YI+Z)vMZ@(|>xO4FHI}4w#-}Cd{4>x@= z-PJwc|IYWTu9`po^ux!WZEnj+0SXDr@@;fJ#Hc1E5(y&>E7SkygO`he=nezqT ztGd>Z=XgFd&U?P4{4=(ti%fpT^KtQ%Y1!2ZWvf~$+iqdX)V4=Dtg27wk~B4|T%9#b zij1B>xigOe6iwH1)D%K|OO4Rt5h`s<4Z?ZQExhQQIcqX4hVJ5ydS%y%JZl%k&7kQ| z+Z8+SNcyf>*XKOX$wy}-scic21t64_eXms3th_c03{TtI5g&|`{&jFe*E7INX@%Dy z&?CNWZGZtAzpfk8suXL>Jb7m;Dc3}p7V|jkxw=`oMxp1GWCT}I3~ypYe2Q%Hvf+`@ zfz#u;y80BjWEM7GDk-*lQ?mrxcD0l;mQp5$yJNT~hI{2$ZJJka1^i9&<;2l9VIX#)vTK_|L%?0n&mH(HykbTsmvmn*12j$ zGa>e9&KtEg+o3+o>7-P3wC&igklfSwrI36tU7>r!nD6TcILMieUz$qdG>yn4NSNCLCWCUCwDTXG)d#wN+lkbok^uR zgr2Aa5-u7}f;8W262+j5G+Rbud@e;Y)S=a0WXsiA8cMX4y#EoM5Fg6*3F9I|U zbOTfKC1~3?dkfMm*R7ny(%FhL;a1md4SB4Uzq69Ior)=2ha3z*=@7bXU&$3k-9r|tT+ zYuARLktCK<5`FCOp{C6UwiqR&5Lf!@9Krc^EO=W@&qnenw)7abdzlmhX%!K8jK=&l z3X^meF?k$9${4R3OaQc@q_r%7R4}4C`l?Oxh-W9n7~3uZ_|E;0a*!c0cLAbuMePu! z6%`g{VL46$1?89ml5(5^$YG_H6s384vLm^g*5WkuE7f8f&cj-K&2|WDL3*R0B@KRZ zr4|hC-dapUn+hsImus=)f0|_o$MGWJLLA#WVrSX5=PM`X3{ZHcMgn9bNXVoxx(PVs z`3z9N^9pTGhKFF-wCw|$m!9cmS-K^Re*s@}p%?%F literal 0 HcmV?d00001 diff --git a/B4i/Files/page3.bil b/B4i/Files/page3.bil new file mode 100644 index 0000000000000000000000000000000000000000..f532483843115b3c00a5f4637a2a29b825a25f6a GIT binary patch literal 4042 zcmc&#OK%)S5bnjhHVY2n4dIal!owks@!AGLc=+w$#NOCz$GIRx?@oI?@$AfMw!Kbr zGU9^7#Rr7sh)8hAm4AQ)5{D%635g%TFCZ5qF35ae&F**{IhKfscBJn4x~96T>Z|IS zj8f|1lv0oI-55pdk9tOjk7GSDFgdbfZQx%Fb+u~3cFIIR1kE{P(?HYO^$$k+Guk&^ zLp=kLtf?&^M{PbZsvg2jCtfxkY($qN{?UaHMssha13#)`V;mU_la%`N*T?3p%JGg|s; zp>vO@wO3uz{8rSZ<#HIT_|9nH1>vI<1)*cYi>_mrIjsS1SqTaKEU>8?-{y72M9h{=?g>bjwC{MP02i;CacVq9q3f6t7?0A$gD&a1W>|FH z#~FMxl&57~cgtdCM28D*%`JKozOS3|`5^F$@i&rG)gf#F2xZkUs8lV}X?2}*HI+m~70Em6!}uC*I*em6@aZ$^jO^YmqQnYszBTiTJ)V(tY@ds&RiWUuD5`?^gsagi&YTjkXt6Z!M` zakA5Fa&(BYBl3Ly90L;DYofi zLunqhBh--8n!Vx~9%&&R_Rv-;xJHu7rWy(8BXd!Q6*s=PPN`CBgF^tP*gNrLDJ0HP zi4nrLwL#ix-`?8V;vpiT%NRpLjK1UA#-Tx4Os!)-n}3#(v-@OHbSbFVigZveD!-}!qRZi0NJp9Yy>RKDV>SH9EU=M|Mc1KE@CbbyjKXgOJ5` zV^4-46;I+WANw!up1Y*Qv+u{PHV!TJpG{fLiI|8(-k}5v5hVojoj@ER5Z4&397({3 zzcG~_!4y$43M7<_QI3Hq8~->3O2#3PpTa)eOi4|lkq-K{la3**Vs%LeBaw7)kAy`d@kzjqbj$%g&~(hhz~*Ap zg_1_^EE?dXeN*p=N2^oImZph;8wb}+``%H$Xepbj{%WyfUvwq1==|avw%%QCz=8Jm z+k0?G_UYA2<|YJB>5$R1OE$>C1Uk@&tyr6niw`;WN)$ih+D5wG{H?URwc&t_AQE(H zM#ex&YhBGYDB*x2{1XJO8hAqdoaGqfofq8fmJ*7oCfnRl5T>>RWCi?)(H9{El{DZ$ z+Q_kA)1F%q8_bOq{Q0qL!b4S*tNs|5;vD5HFO!UYjaAKh^6C?z4kCvU6evd?W5`ku z%)?$(_;6|Wr>*Gm`m1~}GJ6^M@&?zg)S&WqyRREP@De8TF@(e5Aq{9Pb|+#=RP7@^ zB!;YV!k8RqO!sxh+(A;iz7?5+zpIsq2`^G~v4w;?WXu1v?I7tQ=`+skfA^!`XC-@b z_*^DCKI#@C0Dcjz~JjqxrqN)+ShH{-cG0#%ko5C(g z&Uf~_e{mjhBjI