Localización compartida en el cliente QT

¿Cómo usarlo?

Uso trivial

En una conversación, el usuario puede hacer clic en el icono de ubicación para mostrar un mapa. Si Location Services está habilitado en el dispositivo, se mostrará la posición del usuario en el mapa, junto con las ubicaciones de todos los demás miembros que comparten su ubicación (desde todas las conversaciones de la cuenta seleccionada). El usuario puede activar y desactivar el intercambio de ubicación haciendo clic en los botones de intercambio de ubicación.

Cuando un usuario comparte su ubicación en una conversación, un icono de ubicación rojo aparecerá en el icono de conversación. Si el usuario recibe una ubicación de otro miembro, se mostrará un icono de ubicación naranja en todas las conversaciones en las que el miembro esté presente.

El usuario puede interactuar con el mapa mediante reciclar, acercarse y sacarse, moverlo y cerrarlo. El mapa también puede ser fijado o desfijado. Cuando el mapa está desfijado, se puede replicar si el usuario está en la cuenta correcta. Esta función permite al usuario mantener el mapa visible mientras continúa utilizando Jami.

Uso avanzado

Compartición múltiple

escenario

El usuario ya está compartiendo la ubicación con conversación A y conversación B.

Características

Si el usuario cambia a conversación C, el mapa sigue siendo visible y el usuario tiene dos opciones

  1. Haga clic en el botón de compartir ubicación para compartir ubicación con los miembros de la conversación C.

  2. Haga clic en el botón final de compartir ubicación. Esto aparecerá en un pop-up que permite al usuario desactivar el intercambio de ubicación por completo o dejar de compartir su ubicación con los miembros de la conversación C.

Ventana con pin

Si la ventana está despinta, el usuario no podrá hacer clic en el botón de compartir ubicación porque la ventana ya no está conectada a una conversación. Para comenzar a compartir ubicación con nuevas personas, el usuario debe volver a pinar la ventana. Tenga en cuenta que despinar la ventana no afecta a ningún intercambio de ubicación en curso. Además, hacer clic en el botón final de compartir ubicación mientras la ventana está despinta detendrá todo el intercambio de ubicación actual y no aparecerá ningún pop-up que permita al usuario seleccionar una conversación específica para dejar de compartir con.

Cuentas múltiples

Cada cuenta tiene su propio mapa único. Si el usuario despierta el mapa mientras está en cuenta A, luego cambia a cuenta B y despierta el mapa, dos mapas serán visibles. Los mapas para cuentas A y B muestran las posiciones compartidas con esas cuentas, respectivamente, y están completamente separados entre sí

¿Cómo funciona?

Introducción

Esta característica se divide en tres partes:

  1. Enviando su posición

  2. Recibir un puesto

  3. Muestra una posición

Para determinar la ubicación, se utiliza la API [Qt Positioning]https://doc.qt.io/qt-6/qtpositioning-index.html). Una vez que se determina la posición, se envía como un mensaje en el DHT y se transmite al cliente. La posición recibida se muestra luego utilizando la biblioteca JavaScript [OpenLayers]https://openlayers.org/).

Envío de una posición

Tan pronto como se abre un mapa, la clase Positioning se encarga de recuperar la posición actual utilizando la clase QGeoPositionInfoSource del módulo QtPositioning. La posición se convierte luego en formato JSON y se transmite al positionManager. Esta clase coordina todo el proceso de intercambio de posiciones. La posición se comparte luego a través de la función sendPosition() . Se comparte:

  • Local a través de la señal localPositionReceived para que el usuario pueda ver su propia posición

  • En el DHT se encuentran todas las conversaciones en la lista positionShareConvIds_. Esta lista contiene las claves de todas las conversaciones con las que el usuario quiere compartir su posición.

El formato JSON de una posición es el siguiente:

  • Tipo (mensaje de posición o parada)

  • Latitud

  • Longoitud

  • Tiempo (no utilizado por el cliente)

Un ejemplo de datos: {\"lat\":45.51616583988481,\"long\":-73.620693,\"time\":1671658862000,\"type\":\"Posición\"}

Cuando se envía la posición al demonio, también se transmite la URI del autor.

Cuando el usuario deja de compartir su posición con una conversación, el ID de la conversación se elimina simplemente de la lista positionShareConvIds_. También se envía un mensaje de «stop» a cada participante.

Recibir un puesto

Cuando se recibe una posición, se activa la ranura «onPositionReceived() «. Ya sea una posición local del módulo QtPositioning o una posición de otro contacto.

  • Añadido (el URI no está presente en la lista)

  • Actualizado (el URI ya está presente en la lista)

  • Eliminación (tipo = «Permisa»)

La posición se almacena en la lista en forma de un objeto del tipo positionObject. Este tipo permite un perro de vigilancia para cada posición.

Muestra una posición

Cuando se recibe una posición (slot onPositionReceived() activado), la posición se transmite a Qml que a su vez envía la información a la biblioteca JavaScript [https://openlayers.org/] ]]. El módulo Qt WebEngine permite el puente entre la tecnología web de la biblioteca y Qml. Cada posición se representa por una capa añadida al mapa. La función newPosition() agrega una nueva capa, la función updatePosition() actualiza las coordenadas de la capa, y la función removePosition() elimina la capa.