Partilha de localização no cliente QT

Como é que o usamos?

Utilização trivial

Numa conversa, o utilizador pode clicar no ícone de localização para visualizar um mapa. Se os Serviços de localização estiverem ativados no dispositivo, a posição do utilizador será mostrada no mapa, juntamente com as localizações de todos os outros membros que estão a partilhar a sua localização (de todas as conversas da conta selecionada). O utilizador pode ativar e desativar a partilha de localização clicando nos botões de partilha de localização. Por padrão, a localização do utilizador é partilhada durante 15 minutos, mas esta definição pode ser alterada nas definições da aplicação.

Quando um utilizador está a partilhar a sua localização numa conversa, é apresentado um ícone de localização vermelho no ícone da conversa. Se o utilizador receber uma localização de outro membro, será apresentado um ícone de localização laranja em todas as conversas em que o membro estiver presente.

O utilizador pode interagir com o mapa recentrando-o, aumentando e diminuindo o zoom, movendo-o e fechando-o. O mapa também pode ser afixado ou desafixado. Quando o mapa é retirado, pode voltar a ser afixado se o utilizador estiver na conta correta. Esta funcionalidade permite ao utilizador manter o mapa visível enquanto continua a utilizar o Jami.

Utilização avançada

Partilha múltipla

cenário

O utilizador já está a partilhar a localização com a conversa A e a conversa B.

Funcionalidade

Se o utilizador mudar para a conversação C, o mapa continua visível e o utilizador tem duas opções

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

  2. Clique no botão de fim da partilha de localização. Isto irá abrir uma janela flutuante que permite ao utilizador desativar totalmente a partilha de localização ou apenas deixar de partilhar a sua localização com os membros da conversa C.

Janela fixada

Se a janela não estiver afixada, o utilizador não poderá clicar no botão de partilha de localização porque a janela já não está ligada a uma conversa. Para começar a partilhar a localização com novas pessoas, o utilizador tem de voltar a afixar a janela. Tenha em atenção que desafixar a janela não afeta qualquer partilha de localização em curso. Além disso, se clicar no botão de fim da partilha de localizações enquanto a janela não estiver afixada, todas as partilhas de localizações atuais serão interrompidas e não será apresentada qualquer janela flutuante que permita ao utilizador selecionar uma conversa específica com a qual deixar de partilhar.

Várias contas

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

Como é que funciona? (técnico)

Introdução

Esta funcionalidade divide-se em três partes:

  1. Enviar a posição de uma pessoa

  2. Receber uma posição

  3. Mostrar uma posição

Para determinar a localização, é utilizada a API Qt Positioning. Uma vez determinada a posição, esta é enviada como uma mensagem no DHT e é transmitida ao cliente. A posição recebida é então apresentada utilizando a biblioteca JavaScript OpenLayers.

Enviar uma posição

Assim que um mapa é aberto, a classe Positioning encarrega-se de recuperar a posição atual utilizando a classe QGeoPositionInfoSource do módulo QtPositioning. A posição é então convertida para o formato JSON e é transmitida para o positionManager. Esta classe coordena todo o processo de partilha da posição. A posição é então partilhada através da função sendPosition(). Ela é partilhada:

  • Localizado através do sinal localPositionReceived para que o utilizador possa ver a sua própria posição

  • No DHT para todas as conversações na lista positionShareConvIds_. Esta lista contém as chaves de todas as conversações com as quais o utilizador pretende partilhar a sua posição. A partir desta 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 de paragem)

  • 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 utilizador deixa de partilhar a sua posição com uma conversa, o ID da conversa é simplesmente removido da lista positionShareConvIds_. Uma mensagem «stop» é também enviada a cada participante.

Receber uma posição

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

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

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

  • Eliminado (tipo = “Parar”)

A posição é armazenada na lista sob a forma de um objeto do tipo positionObject. Este tipo permite um watchdog para cada posição. Se a posição não for atualizada dentro de um determinado período de tempo, é removida da lista.

Mostrar uma posição

Quando uma posição é recebida (slot onPositionReceived() acionado), a posição é transmitida para o Qml que, por sua vez, envia a informação para a biblioteca JavaScript OpenLayers. O módulo WebEngine do Qt 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.