Partage de localització en el client QT
Com ho utilitzar?
Utilització trivial
En una conversa, l’usuari pot clicar en l’icona de ubicació per mostrar un mapa. Si Location Services
està activat en el dispositiu, la posició de l’usuari es mostrarà en el mapa, juntament amb les ubicacions de tots els altres membres que comparteixen la seva ubicació (des de totes les converses de l’account seleccionat). L’usuari pot activar i desactivar el partage de ubicació clicant en els botons de partage de ubicació. Per defecte, la ubicació de l’usuari es comparteix durant 15 minuts, però aquest paràmetre pot ser modificat en les configuracions de l’aplicació.
Quan un usuari comparteix la seva ubicació en una conversa, apareix un icon de ubicació vermell en l’icona de conversa. Si l’usuari reben una ubicació d’un altre membre, un icon de ubicació orange es mostrarà en totes les converses en les quals el membre està present.
L’usuari pot interactuar amb el mapa recentant, zoomant, desplaçant i tancant-lo. El mapa també pot ser afixat o desfixat. Quan el mapa està desfixat, es pot replicar si l’usuari està en el compte correcte. Aquesta característica permet que l’usuari mantingui el mapa visible mentre continua utilitzant Jami.
Utilització avançada
Multipartització
escenari
L’usuari ja està compartint la ubicació amb conversa A i conversa B.
Característiques
Si l’usuari passa a conversa C, el mapa encara és visible i l’usuari té dues opcions
Clica en el botó de compartir ubicació per compartir també ubicació amb els membres de la conversa C.
Clica en el botó final de compartir ubicació. Això farà sorgir un pop-up que permet a l’usuari desactivar el compartir ubicació totalment o només deixar de compartir la seva ubicació amb els membres de la conversa C.
Finestres empinats
Si la finestra està despinta, l’usuari no podrà clicar en el botó de compartir ubicació perquè la finestra ja no està connectada a una conversa. Per començar a compartir ubicació amb noves persones, l’usuari ha de re-pinar la finestra.
Comptes múltiples
Cada compte té el seu propi mapa únic. Si l’usuari desenpinta el mapa mentre està en compte A, després passa a compte B i desenpinta el mapa, dos mapes seran visibles. Els mapes per comptes A i B mostren les posicions compartides amb aquests comptes, respectivament, i estan completament separats l’un de l’altre
Com funciona?
Introducció
Aquesta característica es divideix en tres parts:
Enviar la seva posició
Recepció d’una posició
Mostra de la posició
Per determinar la ubicació, s’utilitza l’API [Qt Positioning]https://doc.qt.io/qt-6/qtpositioning-index.html). Una vegada determinada la posició, es envia com a missatge en el DHT i es transmet al client. La posició recepta es visualitza després utilitzant la biblioteca JavaScript [OpenLayers]https://openlayers.org/).
Enviant una posició
Tan aviat com s’obre un mapa, la classe Positioning
s’encarrega de recuperar la posició actual utilitzant la classe QGeoPositionInfoSource
del mòdul QtPositioning
. La posició es converteix després en format JSON i es transmet al positionManager
. Aquesta classe coordina tot el procés de compartir posicions. La posició es comparteix després a través de la funció sendPosition()
.
Localment a través de la
localPositionReceived
senyal perquè l’usuari pugui veure la seva pròpia posicióA la DHT a totes les converses de la llista
positionShareConvIds_
. Aquesta llista conté les claus de totes les converses amb les quals l’usuari vol compartir la seva posició.
El format JSON d’una posició és el següent:
Tip (messatge de posició o parada)
Latitud
Longitud
Temps (no utilitzat pel QtClient)
Un exemple de dades: {\"lat\":45.51616583988481,\"long\":-73.620693,\"temps\":1671658862000,\"tipe\":\"Posició\"}
Quan envia la posició al daemon, l’URI de l’autor també es transmet.
Quan l’usuari deixa de compartir la seva posició amb una conversa, l’ID de la conversa es elimina simplement de la llista positionShareConvIds_
.
Recepció d’una posició
Quan una posició és rebut, desencadena la ranura «onPositionReceived() «. Si es tracta d’una posició local del mòdul QtPositioning
o una posició d’un altre contacte. Al nivell positionManager
, la llista objectListSharingUris_
emmagatzemar totes les posicions del client.
Alegat (l’URI no està present en la llista)
Actualitzat (l’URI ja està present en la llista)
Delet (tipo = «Stop»)
La posició es guarda en la llista en forma d’un objecte del tipus positionObject
. Aquest tipus permet un cani de vigilància per a cada posició. Si la posició no es actualiza en un determinat marc de temps, es suprimeix de la llista.
Mostra de la posició
Quan es rebi una posició (slot onPositionReceived()
), la posició es transmet a Qml que a la seva banda envia la informació a la biblioteca [OpenLayers]https://openlayers.org/) JavaScript. El mòdul Qt WebEngine
permet el pont entre la tecnologia web de la biblioteca i Qml. Cada posició és representada per una capa afegida al mapa. La funció newPosition()
afegirà una nova capa, la funció updatePosition()
actualitzarà les coordinades de la capa, i la funció removePosition()
eliminarà la capa.