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

  1. Clica en el botó de compartir ubicació per compartir també ubicació amb els membres de la conversa C.

  2. 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:

  1. Enviar la seva posició

  2. Recepció d’una posició

  3. 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.