Compartilhamento de localização no cliente QT

Como é que o usamos?

Utilização trivial

Em uma conversa, o usuário pode clicar no ícone de localização para exibir um mapa. Se o Serviços de localização estiver ativado no dispositivo, a posição do usuário será mostrada no mapa, juntamente com as localizações de todos os outros membros que estão compartilhando sua localização (de todas as conversas da conta selecionada). O usuário pode ativar e desativar o compartilhamento de local clicando nos botões de compartilhamento de local. Por padrão, a localização do usuário é compartilhada por 15 minutos, mas essa configuração pode ser modificada nas configurações do aplicativo.

Quando um usuário estiver compartilhando sua localização em uma conversa, um ícone de localização vermelho aparecerá no ícone da conversa. Se o usuário receber uma localização de outro membro, um ícone de localização laranja será exibido em todas as conversas em que o membro estiver presente.

O usuário pode interagir com o mapa, recentralizando, aumentando e diminuindo o zoom, movendo-o e fechando-o. O mapa também pode ser fixado ou retirado do mapa. Quando o mapa não está fixado, ele pode ser fixado novamente se o usuário estiver na conta correta. Esse recurso permite que o usuário mantenha o mapa visível enquanto continua a usar o Jami.

Utilização avançada

Compartilhamento múltiplo

cenário

O usuário já está compartilhando a localização com a conversa A e a conversa B.

Características

Se o usuário mudar para conversa C, o mapa ainda é visível e o usuário tem duas opções

  1. Clique no botão de compartilhamento de localização para também compartilhar a localização com os membros da conversa C.

  2. Clique no botão final do compartilhamento de local. Isso abrirá uma janela pop-up que permite ao usuário desativar totalmente o compartilhamento de local ou apenas parar de compartilhar sua localização com os membros da conversa C.

Janela empinada

Se a janela não estiver fixada, o usuário não poderá clicar no botão de compartilhamento de local porque a janela não está mais conectada a uma conversa. Para começar a compartilhar a localização com novas pessoas, o usuário deve fixar novamente a janela. Observe que desafixar a janela não afeta nenhum compartilhamento de local em andamento. Além disso, ao clicar no botão de término do compartilhamento de local enquanto a janela estiver desafixada, todo o compartilhamento de local atual será interrompido e nenhuma janela pop-up será exibida para permitir que o usuário selecione uma conversa específica para interromper o compartilhamento.

Conta múltipla

Cada conta tem seu próprio mapa exclusivo. Se o usuário desmarcar o mapa enquanto estiver na conta A, depois mudar para a conta B e desmarcar o mapa, dois mapas estarão visíveis. Os mapas das contas A e B exibem posições compartilhadas com essas contas, respectivamente, e são completamente separados um do outro

Como funciona? (técnico)

Introdução

Esta característica é dividida em três partes:

  1. Enviando a posição de alguém

  2. Recebendo uma posição

  3. Exibindo uma posição

Para determinar a localização, é usada a API Qt Positioning. Depois que a posição é determinada, ela é enviada como uma mensagem no DHT e transmitida ao cliente. A posição recebida é então exibida usando a biblioteca JavaScript OpenLayers.

Enviando uma posição

Assim que um mapa é aberto, a classe Positioning se encarrega de recuperar a posição atual usando a classe QGeoPositionInfoSource do módulo QtPositioning. A posição é então convertida para o formato JSON e transmitida para o positionManager. Essa classe coordena todo o processo de compartilhamento de posição. A posição é então compartilhada por meio da função sendPosition(). Ela é compartilhada:

  • Localmente, por meio do sinal localPositionReceived, para que o usuário possa ver sua própria posição

  • Na DHT para todas as conversas na lista positionShareConvIds_. Essa lista contém as chaves de todas as conversas com as quais o usuário deseja compartilhar sua posição. A partir dessa chave, os URIs de todos os participantes são obtidos e uma mensagem de posição é enviada a cada participante.

O formato JSON de uma posição é o seguinte:

  • Tipo (mensagem de posição ou parada)

  • Latitude

  • Longitude

  • Tempo (não utilizado pelo QtClient)

Um exemplo de dados: {\"lat\":45.51616583988481,\"long\":-73.620693,\"time\":1671658862000,\"type\":\"Position\"}

Ao enviar a posição para o daemon, o URI do autor também é transmitido.

Quando o usuário deixa de compartilhar sua posição com uma conversa, o ID da conversa é simplesmente removido da lista positionShareConvIds_. Uma mensagem de “stop” também é enviada a cada participante.

Recebendo uma posição

Quando uma posição é recebida, ela desencadeia o slot “onPositionReceived() “. Seja uma posição local do módulo QtPositioning ou uma posição de outro contato. No nível positionManager, a lista objectListSharingUris_ armazena todas as posições do cliente. A posição é:

  • Adicionado (o URI não está presente na lista)

  • Atualizado (o URI já está presente na lista)

  • Apagado (tipo = “Permite”)

A posição é armazenada na lista sob a forma de um objeto do tipo positionObject. Este tipo permite um cão de guarda para cada posição.

Exibindo uma posição

Quando uma posição é recebida (slot onPositionReceived() acionado), a posição é transmitida para o Qml que, por sua vez, envia as informações para a biblioteca JavaScript OpenLayers. O módulo Qt WebEngine permite a ponte entre a tecnologia web da biblioteca e o Qml. Cada posição é representada por uma camada adicionada ao mapa. A função newPosition() adiciona uma nova camada, a função updatePosition() atualiza as coordenadas da camada e a função removePosition() remove a camada.