Files
Pusher_2.0/Pusher.b4a

923 lines
35 KiB
Plaintext

Build1=Default,pusher.chv.com
File1=96761371-car-icon-white-icon-with-shadow-on-transparent-background.jpg
File10=logo_keymon.png
File11=marker-rojo-0.png
File12=marker-rojo-coche.png
File13=waze.png
File14=waze-moving.png
File15=waze-moving-2.png
File16=waze-moving-small.png
File17=waze-sleeping.png
File18=waze-sleeping-small.png
File19=zzz.png
File2=ballon280.png
File3=ballon50.png
File4=balloon_overlay_close.png
File5=datetimelayout.bal
File6=icon-transit.png
File7=icon-transit-small.png
File8=infowindow.bal
File9=Layout.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
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=googlemapsextras
Library11=gps
Library12=ime
Library13=javaobject
Library14=json
Library15=okhttputils2
Library16=phone
Library17=randomaccessfile
Library18=reflection
Library19=runtimepermissions
Library2=byteconverter
Library20=sql
Library21=xcustomlistview
Library22=xui
Library23=nb6
Library3=compressstrings
Library4=core
Library5=dateutils
Library6=firebaseanalytics
Library7=firebasenotifications
Library8=fusedlocationprovider
Library9=googlemaps
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~<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="27"/>~\n~<supports-screens android:largeScreens="true" ~\n~ android:normalScreens="true" ~\n~ android:smallScreens="true" ~\n~ android:anyDensity="true"/>)~\n~SetApplicationAttribute(android:icon, "@drawable/icon")~\n~SetApplicationAttribute(android:label, "$LABEL$")~\n~CreateResourceFromFile(Macro, Themes.LightTheme)~\n~'End of default text~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.GooglePlayBase)~\n~CreateResourceFromFile(Macro, FirebaseAnalytics.Firebase)~\n~CreateResourceFromFile(Macro, FirebaseNotifications.FirebaseNotifications)~\n~AddPermission(android.permission.ACCESS_FINE_LOCATION)~\n~AddPermission(android.permission.WRITE_EXTERNAL_STORAGE) ' Allows an application to write to external storage.~\n~'Lo siguiente es para la api de google maps, para mostrar un mapa en la app~\n~AddApplicationText(~\n~<uses-library~\n~ android:name="org.apache.http.legacy"~\n~ android:required="false" />~\n~<meta-data~\n~ android:name="com.google.android.geo.API_KEY"~\n~ android:value="AIzaSyCjm5WyRxaLGPvp-zD-OlAZqQjpqWb2VK0"/>~\n~) 'Obtener la llave del API en https://console.cloud.google.com/~\n~'SetServiceAttribute(Tracker, android:foregroundServiceType, "location")~\n~~\n~AddApplicationText(<receiver android:name="anywheresoftware.b4a.objects.AdminReceiver2"~\n~ android:permission="android.permission.BIND_DEVICE_ADMIN">~\n~ <meta-data android:name="android.app.device_admin"~\n~ android:resource="@xml/device_admin" />~\n~ <intent-filter>~\n~ <action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />~\n~ </intent-filter>~\n~</receiver>)~\n~~\n~CreateResource(xml, device_admin.xml,~\n~<device-admin xmlns:android="http://schemas.android.com/apk/res/android">~\n~ <uses-policies>~\n~ <limit-password />~\n~ <reset-password />~\n~ <force-lock />~\n~ </uses-policies>~\n~</device-admin>~\n~)~\n~~\n~SetActivityAttribute(main, android:windowSoftInputMode, adjustPan|stateHidden)~\n~'SetActivityAttribute(main, android:windowSoftInputMode, adjustResize|stateHidden) 'Para que suba al abrir el teclado junto con la libreria IME
Module1=DBRequestManager
Module2=FirebaseMessaging
Module3=Mods
Module4=MyPopup
Module5=Starter
Module6=Subs
NumberOfFiles=19
NumberOfLibraries=23
NumberOfModules=6
Version=12.8
@EndOfDesignText@
#Region Project Attributes
#ApplicationLabel: Pusher 2.0
#VersionCode: 1
#VersionName: 4.02.16
'Ver. 3.09.18 - Se agregó la posibilidad de mostrar puntos internedios en la ruta y muestra icono diferente si esta en movimiento o parado.
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: portrait
#CanInstallToExternalStorage: False
#BridgeLogger: True
'###########################################################################################################
'###################### PULL #############################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\cmd.exe&Args=/c&Args=git&Args=pull
'###########################################################################################################
'###################### PUSH #############################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=github&Args=..\..\
'###########################################################################################################
'###################### PUSH TORTOISE GIT #########################################################
'Ctrl + click ide://run?file=%WINDIR%\System32\WindowsPowerShell\v1.0\powershell.exe&Args=TortoiseGitProc&Args=/command:commit&Args=/path:"./../"&Args=/closeonend:2
'###########################################################################################################
#End Region
#AdditionalJar: com.android.support:support-v4
#AdditionalJar: com.google.android.gms:play-services-location
#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.
'Api
Private const API_KEY As String = "AAAAv1qt3Lk:APA91bECIR-pHn6ul53eYyoVlpPuOo85RO-0zcAgEXwE7vqw8DFSbBtCaCINiqWQAkBBZXxHtQMdpU6B-jHIqgFKVL196UgwHv0Gw6_IgmipfV_NiItjzlH9d2QNpGLp9y_JUKVjUEhP"
Private rp As RuntimePermissions
Dim db As SQL
Dim phn As Phone
Dim devModel As String
Dim dUbicados As Int 'Dispositivos con ubicacion
Dim dispositivos As Map
Public GZip As GZipStrings
Dim base64 As String
Dim rutaGPS, rRuta, fechaInicioRutaGPS, fechaFinRutaGPS As String
Dim rutasGPS As Map
' Dim topics As List
Dim clientes As List
Dim dispLVClic As Map
Dim rutaClic, rutaAnt As String 'ignore
Dim colorAnt As Int = 1
Dim line, lineAnt As Polyline 'ignore
Dim tracker As String = "Trckr"
Dim wifi, montoTotal As String
Dim reqManager As DBRequestManager
Dim mapaDestino As Int = 1
Private hInicio, hFinal As String
Private distanciaRecorrida As String = "0"
Private usuario As String
Dim punto As LatLng
End Sub
Sub Globals
'These global variables will be redeclared each time the activity is created.
Private gmap, gmap2 As GoogleMap
Dim MapFragment1 As MapFragment
Dim latmarker As String
Dim longmarker As String
Dim timemarker As Long
Dim batt As Int
Dim ListView1 As ListView
Private MapPanel As Panel
Dim InfoWindowPanel As Panel
Private TitleLabel As Label
Private SnippetLabel As Label
Private ThumbImage As ImageView
Private cuantos As Label
Private ubicados As Label
Private L_RutaInfo As Label
Private et_buscador As EditText
Private b_buscar As Button
'/////// Popup
Dim const popupItemSettings As String = Chr(0xF05B) & " Borrar Ruta"
Dim const popupItemContactUs As String = Chr(0xF1D9) & " Limpiar Mapa"
Dim const popupItemBorraTodosGPS As String = Chr(0xF059) & " Borrar GPS Todos"
Dim popExample As MyPopup
Private b_dameRuta As Button
Dim IME As IME
Private p_buscador As Panel
Dim topInicialBuscador As Int
Private L_RutaInfo As Label
Private s_tracker As Spinner
Dim aBuscar As String
Private p_principal As Panel
Private p_ruta As Panel
Private b_regresar As Button
Private b_getRuta As Button
Private MapFragment2 As MapFragment
' Private lv_hora As ListView
' Private s_hora As Spinner
Private b_limpiaMapa, b_inicioMenos, b_inicioMas, b_finalMenos, b_finalMas As Button
Private l_periodo As Label
Private et_inicio, et_final As EditText
Private p_periodoInfo As Panel
Private p_mapa2 As Panel
Private l_periodoTitulo As Label
Private l_distanciaRecorrida As Label
Private s_rutas As Spinner
Private l_rutas As Label 'ignore
Private rutaSeleccionada As String = ""
Private p_contenedor1 As Panel
Private cb_puntosIntermedios As CheckBox
Private p_addGeofence As Panel
Private et_gc_nombre As EditText
Private b_gc_cancelar As Button
Private b_gc_ok As Button
Private b_geocercas As Button
Private p_geocercas As Panel
Private lv_geocercas As ListView
Private b_cerrar As Button
End Sub
Sub Activity_Create(FirstTime As Boolean) 'ignore
Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
' Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
db = Subs.dbInit
Dim p As String 'ignore
If File.ExternalWritable Then
p = File.DirRootExternal
Else
p = File.DirInternal
End If
' Log("rootExternal="&p)
' Log("File.DirInternal="&File.DirInternal)
' Log("File.DirRootExternal="&File.DirRootExternal)
Activity.LoadLayout("Layout")
clientes.Initialize
clientes.AddAll(Array As String("Trckr","Trckr-ML","Trckr-This","Trckr-Cedex","Trckr-GunaReparto","Trckr-Durakelo"))
IME.Initialize("IME")
dispLVClic.Initialize
Wait For MapFragment1_Ready
gmap.IsInitialized
gmap = MapFragment1.GetMap
rp.CheckAndRequest(rp.PERMISSION_ACCESS_FINE_LOCATION)
Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
If Result Then
gmap.MyLocationEnabled = True
Else
Log("Sin permisos de ubicacion")
End If
' For android_id
devModel = phn.Model
dispositivos.Initialize
rutaClic = ""
rutasGPS = CreateMap("r" : rRuta)
popExample.Initialize( Activity, Me, "popExample", Array As String( popupItemSettings, popupItemContactUs, popupItemBorraTodosGPS ), 100%x, 100%y, Typeface.FONTAWESOME )
IME.AddHeightChangedEvent
' Log(" BT="&b_buscar.Top)
topInicialBuscador = p_buscador.top
s_tracker.AddAll(clientes)
cb_puntosIntermedios.Checked = True
p_geocercas.BringToFront
p_geocercas.Left = (Activity.Width / 2) - (p_geocercas.Width / 2)
' reqManager.Initialize(Me, "http://10.0.0.205:1782")
' s_hora.AddAll(Array As String("00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23"))
End Sub
Sub Activity_Resume
Subs.panelVisible(p_principal, 0, 0)
p_principal.Width = Activity.Width
p_principal.Height = Activity.Height
Subs.centraPanel(p_contenedor1, p_principal.Width)
devModel = phn.Model
reqManager.Initialize(Me, "http://keymon.lat:1781")
Starter.rp.CheckAndRequest(Starter.rp.PERMISSION_ACCESS_FINE_LOCATION)
Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
' If Result Then
' StartService(Tracker)
' Log("Start Tracker")
' Else
' ToastMessageShow("Sin permisos de ubicacion", True)
' End If
' Dim p As Period
' p.Hours = -2
' p.Minutes = -30
' Dim x As String = DateUtils.AddPeriod(DateTime.Now, p)
'' x = DateUtils.SetDateAndTime(2022, 2, 24, 20, 20, 20)
' Log(Subs.fechaKMT(x))
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "seleccionaRutasGPS"
reqManager.ExecuteQuery(cmd , 0, "seleccionaRutasGPS", 0)
calculaPeriodo
End Sub
Sub Activity_Pause (UserClosed As Boolean)
'Starter.StopFLP
' CallSub(Tracker, "StopFLP")
Starter.logger = False
End Sub
Sub Button1_Click
Log("Peticion enviada")
Dim tipos As String
tipos="pu,ping"
ToastMessageShow("Solicitud Enviada : "&tipos,True)
Mensaje(tracker, "Peticion","DameUbicacion", tipos)
' Message("Trckr", "Ping","ping", "ping")
' gmap.Clear 'Limpiamos mapa
ListView1.Clear ' Limpiamos Listview
dispositivos.Initialize
End Sub
'Mandamos mensaje
Sub Mensaje(Topic As String, Title As String, Body As String, Tipos As String)
LogColor("Mandamos mensaje", Colors.Magenta)
Dim Job As HttpJob
Job.Initialize("fcm", Me)
Dim m As Map = CreateMap("to": $"/topics/${Topic}"$)
Dim data As Map = CreateMap("title": Title, "body": Body, "t": Tipos)
m.Put("data", data)
Dim jg As JSONGenerator
jg.Initialize(m)
Job.PostString("https://fcm.googleapis.com/fcm/send", jg.ToString)
Job.GetRequest.SetContentType("application/json;charset=UTF-8")
Job.GetRequest.SetHeader("Authorization", "key=" & API_KEY)
Log(m)
End Sub
Sub JobDone(Job As HttpJob)
If Job.Success = False Then
ToastMessageShow("Error: " & Job.ErrorMessage, True)
Else
If Job.JobName = "DBRequest" Then
If Starter.logger = True Then LogColor("JobDone: '" & reqManager.HandleJob(Job).tag & "' - Registros: " & reqManager.HandleJob(Job).Rows.Size, Colors.Green) 'Mod por CHV - 211027
Dim result As DBResult = reqManager.HandleJob(Job)
If result.Tag = "seleccionaRutaGPS2" Then 'query tag
rutaGPS = ""
Private estasCoords, coordsAnt As Location
estasCoords.Initialize
coordsAnt.Initialize
Private cont As Int = 0
Subs.SetDateFormat("es", "MX", "MMM d")
distanciaRecorrida = 0
cont = 0
Private c As Cursor = db.ExecQuery("select * from geocercas")
For Each records() As Object In result.Rows
' Log(records(result.Columns.Get("FECHA")))
If cont = 0 Then
usuario = records(result.Columns.Get("RUTA"))
fechaInicioRutaGPS = Subs.fechaKMT2Ticks(records(result.Columns.Get("FECHA")))
DateTime.timeformat = "HH:mm"
fechaInicioRutaGPS = DateTime.Date(fechaInicioRutaGPS) & ", " & DateTime.Time(fechaInicioRutaGPS)
End If
Private d As String = records(result.Columns.Get("DATOS")) & "," & records(result.Columns.Get("FECHA"))
Private l As List = Regex.Split(",", d)
' Log(rutaSeleccionada)
estasCoords.Initialize
estasCoords.Latitude = l.Get(0)
estasCoords.Longitude = l.Get(1)
Private acc0 As List = Regex.Split(":", l.Get(2))
' Log(acc0)
Private acc As String
If acc0.Size = 1 Then acc = acc0.Get(0) Else acc = acc0.Get(1)
If acc < 30 Then
rutaGPS = rutaGPS & d & CRLF
If cont > 0 Then
distanciaRecorrida = distanciaRecorrida + coordsAnt.DistanceTo(estasCoords)
' Log($"Distancia: $1.0{coordsAnt.DistanceTo(estasCoords)} mts, Total: $1.0{distanciaRecorrida} mts"$)
End If
End If
cont = cont + 1
coordsAnt.Latitude = estasCoords.Latitude
coordsAnt.Longitude = estasCoords.Longitude
fechaFinRutaGPS = Subs.fechaKMT2Ticks(records(result.Columns.Get("FECHA")))
DateTime.timeformat = "HH:mm"
fechaFinRutaGPS = DateTime.Date(fechaFinRutaGPS) & ", " & DateTime.Time(fechaFinRutaGPS)
Next
Private estaGC As Location
Private enGeocerca As Boolean = False
If c.RowCount > 0 Then
For i = 0 To c.RowCount - 1
c.Position = i
estaGC.Initialize
estaGC.Latitude = c.GetString("lat")
estaGC.Longitude = c.GetString("lon")
' Log(estasCoords & "|" & thisGC)
' Log(estasCoords.DistanceTo(estaGC))
If estasCoords.DistanceTo(estaGC) < 300 Then
ToastMessageShow($"Dentro de ${c.GetString("nombre")}"$, False)
Starter.dentroDeGeocerca.Put(usuario, c.GetString("nombre"))
' Log("+*************** " & Starter.dentroDeGeocerca)
' Subs.notiHigh($"Geocerca"$, $"${usuario} esta dentro de ${c.GetString("nombre")}"$, 777, "Main")
enGeocerca = True
End If
Next
End If
If Not(enGeocerca) Then
Starter.dentroDeGeocerca.Remove(usuario)
Log(Starter.dentroDeGeocerca)
' Subs.notiHigh("Geocercas", $"${usuario} salió de geocerca."$, 777, "Main")
End If
Private textoNoti As String = ""
For Each key As String In Starter.dentroDeGeocerca.Keys
' Log(Starter.dentroDeGeocerca.Get(key))
textoNoti = $"${textoNoti}${CRLF}${key} - ${Starter.dentroDeGeocerca.Get(key)} "$
Next
' Log(textoNoti)
notiBigText("Geocercas", $"${textoNoti}"$, 777, "Main")
c.Close
ToastMessageShow("Recibimos ruta con " & reqManager.HandleJob(Job).Rows.Size & " puntos.", False)
' Log(rutaGPS)
' LogColor($"Distancia recorrida: $1.1{distanciaRecorrida/1000} kms."$, Colors.Magenta)
l_distanciaRecorrida.Text = $"Dist. recorrida: $1.1{distanciaRecorrida/1000} kms."$
muestraRuta
End If
End If
If Job.JobName = "DBRequest" Then
If result.Tag = "seleccionaRutasGPS" Then 'query tag
s_rutas.Clear
s_rutas.Add("Selecciona")
For Each records() As Object In result.Rows
For Each k As String In result.Columns.Keys
' Log(result.Tag & ": " & k & ": " & records(result.Columns.Get(k)))
s_rutas.Add(records(result.Columns.Get(k)))
Next
Next
End If
End If
End If
Job.Release
End Sub
Sub notiBigText(title2 As String, body2 As String, id2 As String, act As Object)
Dim smiley As Bitmap = LoadBitmapResize(File.DirAssets, "logo_keymon.png", 24dip, 24dip, False)
Dim n As NB6
n.Initialize("default", Application.LabelName, "HIGH").SmallIcon(smiley)
' Dim cs As CSBuilder
n.BigTextStyle("Geocercas", "", "")
n.OnGoing(True)
' n.SetDefaults(true, True, True)
n.Build(title2, body2, "tag", act).Notify(id2)
End Sub
public Sub ubicacionRecibida(message As Map)
'Aqui mostramos la ubicacion recibida en el mapa
Dim coords As List = Regex.Split(",",message.Get("body"))
latmarker=coords.Get(0)
longmarker=coords.Get(1)
devModel=message.Get("d")
wifi=message.Get("w")
montoTotal =message.Get("mt")
batt=message.Get("b")
Dim v As String = message.Get("v")
If Starter.logger Then Log("Ubicacion recibida : "&message.Get("d")&","&message.Get("t")&","&message.Get("body"))
If message.Get("t") = "au" Then 'Si es actualizacion
' For i=0 To message.Size-1
' Log(message.GetKeyAt(i)&"="&message.GetValueAt(i))
' Next
L_RutaInfo.Text = "Ruta: "&rutaClic&CRLF&"Bateria: "&message.Get("b")&"%"&CRLF& _
"Monto Total: $"&message.Get("mt")&CRLF&"Wifi: "&wifi&CRLF& _
"Version: "&message.Get("v")&CRLF
Subs.mueveCamaraMapa(MapFragment1, latmarker, longmarker)
End If
If coords.Size > 2 And IsNumber(coords.Get(2)) Then 'Si hay fecha en coordenadas ...
Dim timemarker As Long=coords.Get(2)
Else
Dim timemarker As Long=0
End If
Dim dispData As Map = CreateMap("coords" : coords.Get(0)&","&coords.Get(1), "tm" : timemarker, "d" : message.Get("d"), "b" : batt, "w" : wifi, "mt" : montoTotal, "v" : v)
dispositivos.Put(message.Get("d"), dispData)
' Log("dispositvos="&dispositivos)
' Log(DateTime.Time(timemarker))
MapFragment1_Ready
If Starter.logger Then Log("Dispositivos : "&dispositivos.Size)
End Sub
Sub agregaAListview
ListView1.Clear ' Limpiamos Listview
ListView1.SingleLineLayout.Label.TextSize = 13
ListView1.SingleLineLayout.ItemHeight = 30dip
ListView1.SingleLineLayout.Label.textColor=Colors.Black
dUbicados=0
For i = 0 To dispositivos.Size - 1
Dim vals As Map = dispositivos.GetValueAt(i)
Dim thisRuta As String = dispositivos.GetKeyAt(i)
thisRuta = thisRuta.ToUpperCase
aBuscar = et_buscador.Text
aBuscar = aBuscar.ToUpperCase
' Log(vals)
If vals.ContainsKey("tm") And vals.Get("tm") <>"" Then
Dim located As String = " *" 'Si ya tenemos ubicacion, agregamos un asterisco
dUbicados=dUbicados+1
Else
Dim located As String = ""
End If
If aBuscar <> "" Then
If thisRuta.IndexOf(aBuscar) > -1 Then
ListView1.AddSingleLine2(dispositivos.GetKeyAt(i)&located, dispositivos.GetValueAt(i))
End If
Else
ListView1.AddSingleLine2(dispositivos.GetKeyAt(i)&located, dispositivos.GetValueAt(i))
End If
Next
cuantos.Text = "Rutas"&CRLF&ListView1.Size
ubicados.Text = "Ubicados"&CRLF&dUbicados
' Log("dUbicados="&dUbicados)
End Sub
Sub IME_HeightChanged(NewHeight As Int, OldHeight As Int)
If NewHeight < (topInicialBuscador + p_buscador.Height) Then ' Si el teclado tapa al buscador
If OldHeight > NewHeight Then 'Si se redujo la pantalla
p_buscador.Top = NewHeight - b_buscar.Height
Else ' Si se amplio la pantalla
p_buscador.Top = topInicialBuscador
End If
Else
p_buscador.Top = topInicialBuscador
End If
' ToastMessageShow("Height changed", False)
End Sub
Sub b_buscar_Click
agregaAListview
IME.HideKeyboard
End Sub
Sub ListView1_ItemClick (Position As Int, Value As Object)
dispLVClic = Value
rutaClic = dispLVClic.Get("d")
' Log("RutaClic="&dispLVClic.Get("d"))
Dim w As String = dispLVClic.Get("w")
Log("******************"&w&" - "&w.Length)
If w <> "" And w <> Null And w <> "null" Then
w = "Wifi: "&w&CRLF
Else
w = ""
End If
' L_RutaInfo.Text = "Ruta: "&rutaClic&CRLF
' For i=0 To dispLVClic.Size-1
' Log(dispLVClic.GetKeyAt(i)&"="&dispLVClic.GetValueAt(i))
'' If dispLVClic.GetKeyAt(i)="d" Then L_RutaInfo.Text = "Ruta: "&dispLVClic.GetValueAt(i)&CRLF
' If dispLVClic.GetKeyAt(i)="b" And dispLVClic.GetValueAt(i) <> "null" Then L_RutaInfo.Text = L_RutaInfo.Text&"Bateria: "&dispLVClic.GetValueAt(i)&"%"&CRLF
' If dispLVClic.GetKeyAt(i)="mt" And dispLVClic.GetValueAt(i) <> "null" Then L_RutaInfo.Text = L_RutaInfo.Text&"Monto Total: $"&dispLVClic.GetValueAt(i)&CRLF
' If dispLVClic.GetKeyAt(i)="w" And dispLVClic.GetValueAt(i) <> "null" Then L_RutaInfo.Text = L_RutaInfo.Text&"Wifi: "&dispLVClic.GetValueAt(i)&CRLF
' If dispLVClic.GetKeyAt(i)="v" And dispLVClic.GetValueAt(i) <> "null" Then L_RutaInfo.Text = L_RutaInfo.Text&"Version: "&dispLVClic.GetValueAt(i)&CRLF
' Next
L_RutaInfo.Text = "Ruta: "&rutaClic&CRLF&"Bateria: "&dispLVClic.Get("b")&"%"&CRLF& _
"Monto Total: $"&dispLVClic.Get("mt")&CRLF&w&"Version: "&dispLVClic.Get("v")&CRLF
Dim thisVals As Map = Value
Log(thisVals)
Dim coords As List = Regex.Split(",", thisVals.Get("coords"))
'Mueve el mapa a la posicion solicitada
Subs.mueveCamaraMapa(MapFragment1, coords.Get(0), coords.Get(1))
End Sub
Sub b_actUbic_click
Mensaje(dispLVClic.Get("d"), "Peticion","DameUbicacion", "pu,au")
ToastMessageShow("Solicitamos Ubicacion: "&rutaClic, True)
End Sub
Sub b_dameRuta_click
Mensaje(dispLVClic.Get("d"), "Peticion","DameRuta", "dr")
ToastMessageShow("Solicitamos Ruta: "&rutaClic, True)
End Sub
Sub b_dameRuta_LongClick
popExample.Show(b_dameRuta) 'Show the menu, anchored to the button.
End Sub
Sub MapFragment1_Ready
gmap = MapFragment1.GetMap
'///////////////////////////////////////////
Dim GoogleMapsExtras1 As GoogleMapsExtras
Dim InfoWindowAdapter1 As InfoWindowAdapter
InfoWindowAdapter1.Initialize("InfoWindowAdapter1")
GoogleMapsExtras1.SetInfoWindowAdapter(gmap, InfoWindowAdapter1)
InfoWindowPanel.Initialize("")
InfoWindowPanel.LoadLayout("InfoWindow")
' a hack(ish) way to set InfoWindowPanel width and height!
MapPanel.AddView(InfoWindowPanel, 0, 0, 240dip, 90dip)
InfoWindowPanel.RemoveView
'/////////////////////////////////////////////
Dim horaFecha As String = timemarker
Dim hms As String = horaFecha.SubString(6) 'Tomamos solo la parte de la hora
' Log("hms="&hms)
Dim horasMinsSegs As String = hms.SubString2(0,2)&":"&hms.SubString2(2,4)&":"&hms.SubString(4)
' Log(horasMinsSegs)
If wifi <> "" And wifi <> Null Then
wifi = $"Wifi: ${wifi&CRLF}"$
Else
wifi = ""
End If
If aBuscar <> "" Then
If devModel.IndexOf(aBuscar) > -1 Then
Dim Marker1 As Marker
Marker1 = gmap.AddMarker(latmarker, longmarker, devModel)
Marker1.Title = devModel
Marker1.Snippet = "Last Loc: "&horasMinsSegs&CRLF&"Monto Total: "&montoTotal&CRLF&"Bateria: "&batt&"%"
End If
Else
Dim Marker1 As Marker
Marker1 = gmap.AddMarker(latmarker, longmarker, devModel)
Marker1.Title = devModel
Marker1.Snippet = "Last Loc: "&horasMinsSegs&CRLF&"Monto Total: "&montoTotal&CRLF&"Bateria: "&batt&"%"
End If
' Subs.mueveCamaraMapa(MapFragment1, latmarker, longmarker)
End Sub
Sub MapFragment2_Ready
gmap2 = MapFragment2.GetMap
'///////////////////////////////////////////
Dim GoogleMapsExtras2 As GoogleMapsExtras
Dim InfoWindowAdapter2 As InfoWindowAdapter
InfoWindowAdapter2.Initialize("InfoWindowAdapter1")
GoogleMapsExtras2.SetInfoWindowAdapter(gmap2, InfoWindowAdapter2)
InfoWindowPanel.Initialize("")
InfoWindowPanel.LoadLayout("InfoWindow")
' a hack(ish) way to set InfoWindowPanel width and height!
MapPanel.AddView(InfoWindowPanel, 0, 0, 190dip, 80dip)
InfoWindowPanel.RemoveView
'/////////////////////////////////////////////
End Sub
Sub MapFragment2_LongClick(Point As LatLng)
Log("LONG: " & Point)
p_addGeofence.BringToFront
p_addGeofence.Left = (Activity.Width / 2) - (p_addGeofence.Width / 2)
p_addGeofence.Visible = True
punto = Point
End Sub
Sub InfoWindowAdapter1_GetInfoContents(Marker1 As Marker) As View
' the default InfoContent will be used if this event Sub is not defined or if it returns Null
' Log("InfoWindowAdapter1_GetInfoContents")
TitleLabel.Text=Marker1.Title
SnippetLabel.Text=Marker1.Snippet
' ThumbImage.Bitmap=? how will you store the file path/file name of the image to display?
' it's a shame that the Marker object has no Tag property which could be used to store such info
Return InfoWindowPanel
End Sub
Sub InfoWindowAdapter2_GetInfoContents(Marker1 As Marker) As View
' the default InfoContent will be used if this event Sub is not defined or if it returns Null
' Log("InfoWindowAdapter1_GetInfoContents")
TitleLabel.Text=Marker1.Title
SnippetLabel.Text=Marker1.Snippet
' ThumbImage.Bitmap=? how will you store the file path/file name of the image to display?
' it's a shame that the Marker object has no Tag property which could be used to store such info
Return InfoWindowPanel
End Sub
Sub muestraRuta
Log("-------- = iniciamos MuestraRuta")
MapFragment2_Ready
Private estasCoords, coordsAnt As Location
coordsAnt.Initialize
estasCoords.Initialize
' If lineAnt.IsInitialized Then lineAnt.Visible = False 'Ocultamos ruta anterior
If mapaDestino = 1 Then
gmap2 = MapFragment1.GetMap
Else
gmap2 = MapFragment2.GetMap
End If
Dim points As List
Dim point As LatLng
Dim lat1, lon1, latIn, lonIn, latOut, lonOut As Double
line = gmap2.AddPolyline
line.Width = 10
' Log("Color ruta")
'Cambiamos el color de la ruta cada vez que se solicite una nueva
If colorAnt = 1 Then line.color=Colors.RGB(255, 54, 54) ' Rojo
If colorAnt = 2 Then line.color=Colors.RGB(78, 85, 255) ' Azul
If colorAnt = 3 Then line.color=Colors.RGB(50, 205, 37) ' Verde
If colorAnt = 4 Then line.color=Colors.RGB(200, 46, 176) ' Purpura
If colorAnt = 5 Then line.color=Colors.RGB(193, 208, 0) ' Amarillo oscuro
If colorAnt = 6 Then line.color=Colors.RGB(247, 113, 252) ' Rosa oscuro
If colorAnt = 7 Then line.color=Colors.RGB(255, 190, 62) ' Naranja
If colorAnt = 8 Then line.color=Colors.RGB(62, 255, 196) ' Cyan
If colorAnt = 9 Then line.color=Colors.RGB(0, 167, 255) ' Azul claro
If colorAnt = 10 Then line.color=Colors.RGB(255, 0, 8) ' Rojo-rosa
colorAnt = colorAnt + 1
If colorAnt = 11 Then colorAnt = 1
points.Initialize
Dim point As LatLng
Dim listtemp As List
' Log(rutaGPS)
Dim speedOut As String = 0
If rutaGPS.Length > 10 Then
listtemp = Regex.Split(CRLF, rutaGPS)
' Log(listtemp.Size)
For i = 1 To listtemp.Size-1
Dim coords() As String = Regex.Split(",", listtemp.Get(i))
If i = 1 Then
latIn = coords(0)
lonIn = coords(1)
End If
latOut = coords(0)
lonOut = coords(1)
estasCoords.Latitude = latOut
estasCoords.Longitude = lonOut
' Log(coordsAnt)
' Log(estasCoords)
Private estaDist As String = coordsAnt.DistanceTo(estasCoords)
' Log(estaDist)
speedOut = coords(4)
Dim Marker0 As Marker
If (i Mod 2 = 0) And estaDist > 300 And cb_puntosIntermedios.Checked Then 'Solo ponemos la mitad de los puntos y si la distancia entre puntos es mayor de 300 mts.
Private hora As String = Subs.fechaKMT2Ticks(coords(6))
DateTime.timeformat = "HH:mm"
hora = DateTime.Time(hora)
If speedOut > 0.5 Then
Marker0 = gmap2.AddMarker3(latOut, lonOut, "Fin " & usuario, LoadBitmap(File.DirAssets, "waze-moving-small.png"))
Else
Marker0 = gmap2.AddMarker3(latOut, lonOut, "Fin " & usuario, LoadBitmap(File.DirAssets, "waze-sleeping-small.png"))
End If
Marker0.Snippet = "Hora: " & hora & CRLF &"Velocidad: " & NumberFormat2((speedOut * 3.6), 1, 2, 2, True) & " km/h"
End If
lat1 = coords(0)
lon1 = coords(1)
point.Initialize(lat1,lon1)
points.Add(point)
coordsAnt.Latitude = latOut
coordsAnt.Longitude = lonOut
Next
line.Points = points ' Mapeamos la ruta en el mapa
lineAnt = line
Dim data As Map = CreateMap("ruta" : line)
rutasGPS.Put(rRuta, data)
' Log(rutasGPS)
' Log("Puntos : "&listtemp.Size)
' ToastMessageShow("Recibimos ruta con "&listtemp.Size&" puntos", True)
rutaAnt = rRuta ' Ponemos en rutaAnt la ruta actual
'Mueve el mapa a las ultmas coordenadas de la ruta
If mapaDestino = 1 Then
Subs.mueveCamaraMapa(MapFragment1, latIn, lonIn)
Else 'Los puntos de la ruta de la base de datos se traen en orden ascendente (los mas viejos primero)
Subs.mueveCamaraMapa(MapFragment2, latOut, lonOut)
Dim Marker1 As Marker
' Marker1 = gmap2.AddMarker(latOut, lonOut, "Fin " & usuario)
If speedOut > 1 Then
Marker1 = gmap2.AddMarker3(latOut, lonOut, "Fin " & usuario, LoadBitmap(File.DirAssets, "waze-moving.png"))
Else
Marker1 = gmap2.AddMarker3(latOut, lonOut, "Fin " & usuario, LoadBitmap(File.DirAssets, "waze-sleeping.png"))
End If
' Marker1.Title = "Fin " & usuario
Marker1.Snippet = "Fecha: " & fechaFinRutaGPS & CRLF & "Velocidad: " & NumberFormat2((speedOut * 3.6), 1, 2, 2, True) & " km/h"
Dim Marker0 As Marker
Marker0 = gmap2.AddMarker2(latIn, lonIn, "Inicio " & usuario, gmap2.HUE_GREEN)
' Marker0.Title = "Inicio " & usuario
Marker0.Snippet = $"Fecha: ${fechaInicioRutaGPS}"$
End If
End If
End Sub
Sub popExample_BtnClick( btnText As String )
' ToastMessageShow(btnText & " selected", False)
If btnText.IndexOf("Borrar Ruta") <> -1 Then
Mensaje(rutaClic, "Peticion","borraRuta", "bgps2")
ToastMessageShow("Borramos Ruta:"&rutaClic, True)
End If
If btnText.IndexOf("Limpiar Mapa") <> -1 Then
gmap.Clear 'Limpiamos mapa
ToastMessageShow("Limpiamos mapa", True)
End If
If btnText.IndexOf("Borrar GPS Todos") <> -1 Then
For c = 0 To clientes.Size-1
Log(clientes.Get(c))
Mensaje(clientes.Get(c), "Peticion","borraRuta", "bgps2")
Next
ToastMessageShow("Borrar GPS Todos", True)
End If
End Sub
Sub s_tracker_ItemClick (Position As Int, Value As Object)
tracker = Value
End Sub
Sub b_buscar_longClick
Starter.logger = True
mapaDestino = 2
Subs.panelVisible(p_ruta, 0, 0)
p_mapa2.Width = Activity.Width
p_mapa2.Height = Activity.Height - p_periodoInfo.Height - l_periodo.Height - l_periodoTitulo.Height
p_mapa2.GetView(0).SetLayout(10, 10, p_ruta.Width, p_mapa2.Height) 'ignore
p_ruta.Width = Activity.Width
p_ruta.Height = Activity.Height
p_periodoInfo.Top = Activity.Height - p_periodoInfo.Height - 5
b_regresar.Top = Activity.Height - b_regresar.Height - 5
b_geocercas.Top = Activity.Height - b_geocercas.Height - 130
l_periodoTitulo.Top = Activity.Height - (Activity.Height - p_mapa2.Height)
l_periodo.Top = Activity.Height - (Activity.Height - p_mapa2.Height) + 10
s_rutas.Top = l_periodoTitulo.Top + l_periodoTitulo.Height
l_rutas.Top = s_rutas.top
l_distanciaRecorrida.Top = l_periodo.Top + l_periodo.Height
End Sub
Sub traeRutaGPS
Log("traemos ruta del servidor")
Dim hi, hf As Period
hi.Hours = et_inicio.text
hf.Hours = et_final.text
' hi.Minutes = -30
' hInicio = DateUtils.AddPeriod(DateTime.Now, hi)
' hFinal = DateUtils.AddPeriod(DateTime.Now, hf)
Dim cmd As DBCommand
cmd.Initialize
cmd.Name = "seleccionaRutaGPS2"
' If et_final.Text = "0" Then hFinal = DateTime.now
calculaPeriodo
cmd.Parameters = Array As Object(Subs.fechaKMT(hInicio), Subs.fechaKMT(hFinal), rutaSeleccionada)
' Log($"Inicio: ${Subs.fechaKMT(hInicio)}, Fin: ${Subs.fechaKMT(hFinal)}, ${rutaSeleccionada}"$)
reqManager.ExecuteQuery(cmd , 0, "seleccionaRutaGPS2", 0)
ToastMessageShow("Solicitamos ruta", False)
End Sub
Private Sub b_getRuta_Click
traeRutaGPS
End Sub
Private Sub b_regresar_Click
p_principal.Visible = True
p_ruta.Visible = False
mapaDestino = 1
End Sub
Private Sub b_limpiaMapa_Click
Private gmap2 As GoogleMap
gmap2.IsInitialized
gmap2 = MapFragment2.GetMap
gmap2.Clear 'Limpiamos mapa
End Sub
Private Sub b_inicioMenos_Click
If et_inicio.text = "" Then et_inicio.Text = "0"
et_inicio.text = Regex.Replace("[ ]", et_inicio.text, "") 'Quitamos espacios
et_inicio.text = $"$1.1{et_inicio.text - 0.5}"$
calculaPeriodo
End Sub
Private Sub b_inicioMas_Click
If et_inicio.text = "" Then et_inicio.Text = "0"
et_inicio.text = Regex.Replace("[ ]", et_inicio.text, "") 'Quitamos espacios
Log(et_inicio.text)
et_inicio.text = $"$1.1{et_inicio.text + 0.5}"$
calculaPeriodo
End Sub
Private Sub b_finalMenos_Click
If et_final.text = "" Then et_final.Text = "0"
et_final.text = Regex.Replace("[ ]", et_final.text, "") 'Quitamos espacios
et_final.text =$"$1.1{ et_final.text - 0.5}"$
calculaPeriodo
End Sub
Private Sub b_finalMas_Click
If et_final.text = "" Then et_final.Text = "0"
et_final.text = Regex.Replace("[ ]", et_final.text, "") 'Quitamos espacios
et_final.text =$"$1.1{ et_final.text + 0.5}"$
calculaPeriodo
End Sub
Sub calculaPeriodo
Dim hi, hf As Period
Private minsInicio() As String
Private minsFinal() As String
minsInicio = Array As String("0","0")
minsFinal = Array As String("0","0")
hi.Hours = et_inicio.text
minsInicio = Regex.Split("\.", et_inicio.text)
If Regex.Split("\.", et_inicio.text).Length > 0 Then minsInicio = Regex.Split("\.", et_inicio.text)
If minsInicio.Length > 1 Then
hi.Minutes = minsInicio(1)*6
If et_inicio.Text < 0 Then hi.Minutes = minsInicio(1)*6*-1 'Si es negativo lo multiplicamos por -1 par restar los minutos
End If
hf.Hours = et_final.text
minsFinal = Regex.Split("\.", et_final.text)
If Regex.Split("\.", et_final.text).Length > 0 Then minsFinal = Regex.Split("\.", et_final.text)
If minsFinal.Length > 1 Then
hf.Minutes = minsFinal(1)*6
If et_final.Text < 0 Then hf.Minutes = minsFinal(1)*6*-1 'Si es negativo lo multiplicamos por -1 par restar los minutos
End If
hInicio = DateUtils.AddPeriod(DateTime.Now, hi)
hFinal = DateUtils.AddPeriod(DateTime.Now, hf)
l_periodo.Text = $"Del: ${Subs.diaSemanaString(DateTime.GetDayOfWeek(hInicio))} ${DateTime.Time(hInicio)}${CRLF}Al : ${Subs.diaSemanaString(DateTime.GetDayOfWeek(hFinal))} ${DateTime.Time(hFinal)}"$
End Sub
Private Sub s_rutas_ItemClick (Position As Int, Value As Object)
rutaSeleccionada = Value
End Sub
Private Sub p_addGeofence_Click
End Sub
Private Sub b_gc_ok_Click
p_addGeofence.Visible = False
db.ExecNonQuery($"insert into geocercas (nombre, lat, lon) values ('${et_gc_nombre.Text}', '${punto.Latitude}', '${punto.Longitude}')"$)
et_gc_nombre.Text = ""
End Sub
Private Sub b_gc_cancelar_Click
p_addGeofence.Visible = False
End Sub
Private Sub b_geocercas_Click
Private c As Cursor = db.ExecQuery("select * from geocercas")
Dim nombre As Label = lv_geocercas.SingleLineLayout.Label
nombre.TextColor = Colors.Black
nombre.TextSize = 14
lv_geocercas.SingleLineLayout.ItemHeight = 30dip
lv_geocercas.Clear
If c.RowCount > 1 Then
For i = 0 To c.RowCount - 1
c.Position = i
lv_geocercas.AddSingleLine($"${c.GetString("nombre")}"$)
Next
End If
c.Close
p_geocercas.BringToFront
p_geocercas.Visible = True
End Sub
Private Sub lv_geocercas_ItemClick (Position As Int, Value As Object)
ToastMessageShow("Clic largo para borrar", False)
End Sub
Private Sub lv_geocercas_ItemLongClick (Position As Int, Value As Object)
If Msgbox2($"Seguro que desea borrar la geocerca "${Value}""$, "AVISO", "Aceptar", "Cancelar", "", Null) = DialogResponse.POSITIVE Then 'ignore
db.ExecNonQuery($"delete from geocercas where nombre = '${Value}'"$)
End If
p_geocercas.Visible = False
End Sub
Private Sub p_geocercas_Click
End Sub
Private Sub b_cerrar_Click
p_geocercas.Visible = False
End Sub