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
Clique no botão de partilha de localização para partilhar também a localização com os membros da conversa C.
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:
Enviar a posição de uma pessoa
Receber uma posição
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çãoNo 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.