Transcrições
1. Introdução ao curso: Olá a todos. Obrigado por mostrar interesse na minha aula. Nesta aula vamos aprender como aplicativos como aplicativos de bate-papo são construídos em geral. Antes de continuar, devo salientar que estes classe II projetado para as pessoas que já estão familiarizados com o desenvolvimento de aplicativos Android no Android Studio. Ambiente de desenvolvimento integrado, ou linguagem de programação Java, pelo menos. E se você não está familiarizado, você pode achar algumas partes difíceis de entender no início. Agora vamos ver uma prévia rápida do aplicativo que vamos
construir e coisas que vamos aprender. Aqui temos dois emuladores. À direita, já estamos logados e podemos ver uma lista de todos os usuários. E à esquerda, você pode ver que não temos nome de usuário aqui porque não precisamos dele. Entraremos com e-mail e senha. Então vamos agora criar um novo usuário. Vamos chamá-lo de John. Vamos colocar algum e-mail aleatório e vamos colocar algum tipo de senha aqui. Quando clicamos em se inscrever. Uma vez que a inscrição é completa e bem-sucedida, será apresentado com a tela. E a tela é realmente tela onde todos os usuários do nosso aplicativo serão mostrados. Aqui está o John, e do lado direito, ainda não o temos. Mas se fizermos algo assim, teremos John também. Então vamos ver como implementar essa coisa aqui mesmo. Agora, se clicarmos neste ícone aqui, podemos ver a atividade do perfil onde podemos aplaudir a imagem do perfil. Então vamos usar um da galeria. E quando clicamos no upload de foto, podemos ver esses progressos. E, em seguida, a imagem enviada mensagem. Se voltarmos agora, você pode ver que essas imagens ainda não foram atualizadas. Podemos facilmente modificar isso também, mas vamos ver como fazê-lo com atualização, com implementação deslizado ou atualizar recurso. Então agora aqui se fizermos isso mais uma vez, também
veremos essa imagem. Agora começará a conversa com este usuário. Então aqui vamos abrir John porque à esquerda ou dispositivo estamos registrados como John. Agora, vou enviar algum tipo de mensagem daqui. E você pode ver que estamos recebendo uma mensagem bem ali. Então eu vou agora enviar alguns smileys. E está funcionando muito bem. Assim, você pode ver que uma vez que enviamos a mensagem, ela é automaticamente registrada aqui. Então, agora, se voltarmos e abrirmos esta conversa novamente, você pode ver que as mensagens ainda estão lá. Depois de concluir esta aula, você aprenderá habilidades que são muito populares e amplamente utilizadas quando se trata de desenvolvimento de aplicativos móveis. Então, não só você vai aprender a construir aplicativo de bate-papo, mas você também vai aprender tecnologias que você pode aplicar em seus outros projetos. Então, por exemplo, vamos aprender a usar o Firebase como banco de dados online. Vamos ver por que usamos isso. Aprenderemos uma visão recicladora, vista
marcados e muitas outras coisas. Então é isso. Vamos começar e te vejo no próximo vídeo.
2. Como criar a tela de signo/login: Ei pessoal, agora é a hora de começar a criar nosso aplicativo de bate-papo. Então, vamos primeiro criar um novo projeto Android Studio. Vamos escolher atividade vazia. E para o nome do aplicativo. Vamos colocar o bate-papo. Você pode alterar o nome do pacote como quiser e clicar em Concluir. O edifício está terminado e estamos prontos para prosseguir. Então, em primeiro lugar, vamos mudar as cores que vamos usar em nosso aplicativo. Então vamos abrir a pasta de valores e cores abertas. Então vamos mudar a cor primária para o 33 a2 OFF. Agora vamos mudar o escuro primário para o 3.3.1 um FF. Mude este para o f, f, a, f, f. E vamos adicionar mais uma cor, que será chamada de cor secundária. E a cor será F quatro, 33 a F, F. Então temos aqui algum tipo de transparência. Então, agora, quando mudamos de cores, vamos começar a criar nossa atividade principal, onde um usuário pode entrar e fazer login. By the way, você pode usar as cores que você gosta. Você pode fazer o que achar que é o melhor. Então vamos abrir a atividade principal e clicar em Split. Vamos excluir este TextView. Vai colocar texto de edição com o pai de correspondência como a largura para a altura. Usaremos conteúdo envolvente. Vamos fechar esta etiqueta. Este será usado para o nome de usuário. Então vamos colocar dica para ser nome de usuário. Agora vamos adicionar ID, que será ADT nome de usuário. E vamos movê-lo para algum lugar aqui. Agora vamos clicar sobre isso foi para restrição, este texto de edição. Agora vamos adicionar mais um EditText, que também será correspondência pai e conteúdo envolvente. Mas este será para o e-mail. Então vamos colocar ID, e-mail ADT. Vamos restringir este como este. Por isso, será abaixo do nome de usuário editar texto. Agora vamos adicionar o último texto de edição para a senha. Então, aqui vamos colocar senha dica. O ID será a senha EDTA. Além disso, queremos alterar o tipo de entrada para ser senha de texto para que tenhamos nossa senha escondida quando o usuário digita em. Então queremos ter esses pontos quando o usuário começa,
ele começa a escrever sua senha. Agora podemos mover isso um pouco como aqui. Nós também podemos colocar manualmente aqui alguns valores, mas eu vou mantê-los. Agora vamos adicionar um botão onde o usuário irá enviar este formulário. Este botão será Embrulhar Conteúdo. Id será btn enviar. O texto inicial será inscrito. E vamos restringi-la aqui. Mas será centrado. E vamos adicionar alguma margem aqui. Será margem superior e será dez dB. Abaixo deste botão. Queremos este texto que vai dizer já tem login conta. Então, será vista de texto. Conteúdo de embrulho. Id será dx t informações de login. E o texto inicial será I. Já tenho um login na conta. E vamos mover este abaixo deste botão. Então podemos restringir isso assim também. Para que ele seja centrado de acordo com esses botões. Então, se movermos este botão acordado aqui, ele será relacionado a estes Botão. Agora vamos mudar esta margem superior para o 24, e vamos adicionar margem a este TextView para dez d p. Agora precisamos mudar o fundo aqui, bem como a forma do nosso botão. Então vamos criar um arquivo dentro da pasta desenhável. Vamos chamá-lo de gradiente. Aqui em vez de seletor, queremos ter forma. E agora vamos declarar gradiente, que terá cor inicial. O acento e a cor final serão. Cor secundária como esta. Agora vamos aplicar esses gradientes ao nosso layout raiz, que é layout de restrição. Agora vamos colocá-lo para o atributo de fundo como este. E agora precisamos mudar a cor do texto para branco e dróide branco. E precisamos mudar a forma destes botões. Então vamos criar mais um arquivo dentro desta pasta desenhável. Vamos chamá-lo de forma azul redonda. Então aqui vamos mudar isso para a forma. Ele será colorido em cores secundárias, e os cantos serão 90 dB de raio. Vamos apenas aplicar isso ao atributo de fundo do botão. E nós temos o nosso botão. Então agora vamos também mudar a cor do texto para branco aqui. E acredito que temos a nossa tela principal desenhada. Então vamos executar o aplicativo para ver como ele se parece. Agora, você pode ver que esse ângulo da cor é meio errado. Então temos esta cor rosa à esquerda e azul ao lado direito. Por isso, é por causa do problema de renderização no Android Studio, estamos recebendo imagem falsa. Então, vamos mudar o ângulo desta cor para o 270 para alcançar estas cores gradientes exatas. Então aqui você pode tentar coisas diferentes. Então, por exemplo, se
colocarmos 19, teremos na parte inferior. Se
colocarmos 135, teremos do canto inferior direito. Então, basicamente, podemos definir ângulos para os números que podem ser divididos por 45. Então, se você colocar 5454, por exemplo, você vê que nós não temos nada. Então você pode tentar com 4726 e similares. Usaremos 270. Agora vamos executar o aplicativo novamente para ver se temos cor correta agora. Então agora ele está funcionando muito bem. Agora vamos na atividade principal para declarar esses pontos de vista. Então vamos declarar textos de edição. Teremos nome de usuário EDTA, senha e e-mail ADT. Teremos. Botão. E nós temos uma exibição de texto, que é sobre registro de informações. Vamos inicializá-los agora. Ele está aqui. Agora vamos inicializar botão. E, finalmente, TextView, assim. Então agora queremos diferenciar de alguma forma se o usuário vai se inscrever ou fazer login. Então teremos variável que será do tipo booleano. E será chamado facilidade de inscrição. Então, por padrão, será igual ao verdadeiro porque indo para abrir nosso aplicativo, queremos apresentar a página de inscrição em primeiro lugar. E quando o usuário clica na vista de texto aqui, queremos mudar esta tela para o login um, então queremos atualizar o texto dentro botão. Queremos atualizar este texto aqui. E queremos ocultar o campo de nome de usuário. Então, como fazer isso? Vamos definir OnClickListener para a visualização de texto aqui em primeiro lugar, então vamos fazê-lo assim. E quando clicamos se a tela foi para se inscrever, queremos agora alterá-lo para a tela de login e vamos definir esta variável como false. E se estivéssemos na página de login, agora
queremos alterá-lo para a página de inscrição, e esta variável será agora verdadeira. Agora também precisamos atualizar o texto. Agora, botão precisa ter texto que será login. E aqui queremos dizer inscreva-se. Também queremos mudar o texto. Aqui dentro. O texto será não ter uma conta cadastrada. E aqui, queremos definir o texto para o já tem uma conta. Login. Também atualizará este texto aqui. Como este. E também o que queremos alcançar é esconder este texto de edição. Então, vamos aqui definir a visibilidade desses nome de usuário EDTA para ido. E aqui queremos ser visíveis. Agora vamos executar o aplicativo e ver se ele funciona. Se clicarmos neste texto para você, agora
temos esta tela que nos dirá login. E se não tivermos uma conta e quisermos
inscrever-nos, podemos clicar aqui e ser-lhe-á apresentado este campo. Então, agora, se você quer saber por que nós temos essa variável? Variável é usado para determinar quando clicamos no botão Cadastre-se, se queremos começar a fazer login no processo ou se inscrever. Então você verá que quando começarmos a implementar lógica para a autenticação do usuário. Então isso é para este vídeo. E no próximo conectaremos este aplicativo
ao Firebase e registraremos nossos primeiros usuários. Vejo vocês no próximo vídeo.
3. Autenticação de usuário: Ei pessoal, nesta palestra vamos integrar o Firebase com o nosso projeto. Assim, a maneira mais fácil de implementar o Firebase em nosso projeto é clicar em Ferramentas, Firebase, e clicar em autenticação, e-mail e autenticação de senha. E então vamos nos conectar ao Firebase. Agora talvez você não veja esse tipo de tela se você ainda não estiver conectado, no Android Studio. Mas como eu estou logado com esta conta, eu sou apresentado com a tela. E ele já conhece alguns dos meus projetos que estão no Firebase que estão associados a esta conta. Então, se você não vir algo assim, acredito que você será solicitado a assinar no formulário. E sugiro que assine. Assim, será muito mais fácil integrar o Firebase dessa forma. Então, aqui você vê que eu já fui sugerido com o nome do projeto, que é o mesmo do projeto no Android Studio. Então eu vou agora clicar em conectar ao Firebase. A conexão está em andamento. Agora vou abrir meu navegador de internet. Abra o Firebase. Agora vou abrir meu console Firebase, mas com a conta que está associada ao Android Studio. E agora vou clicar em ir para o console. Mei. Você pode ver que eu tenho aplicativo de bate-papo, que é apenas criado. Aqui dentro. Ele diz que o projeto Firebase foi criado e agora estamos conectados. Então, agora é a hora de integrar a autenticação ao nosso aplicativo. Então, vamos clicar aqui e aceitar alterações. Ele agora irá injetar as dependências em nossos scripts Gradle no arquivo Gradle build-up para ser mais exato. Mas como versões mais recentes da autenticação Android Firebase está disponível, vamos alterá-lo para o mais recente e clicar em sincronização. Agora. Agora podemos fechar este assistente e abrir a atividade principal. Então, para ser capaz de autenticar usuários, devemos primeiro habilitar a autenticação em nosso projeto. Então vamos abrir o projeto no console. E vamos para autenticação e vamos configurar o método de assinatura. Vamos ativar a senha de e-mail. E agora podemos criar usuários. Uma vez que esta atividade será usada tanto para registrar quanto para fazer login, vamos criar dois métodos aqui. Um será chamado identificador login, e o segundo será chamado handle. Cadastre-se. Handle login será chamado quando clicarmos no botão. E não vamos nos inscrever. Então aqui e aqui, vamos lidar com a inscrição porque isso significa que estamos atualmente,
digamos, no modo de inscrição. Agora, vamos implementar esse método. Então, vamos chamar a autenticação Firebase. Ponto instância dot criar usuário com e-mail e senha. O e-mail será retirado deste texto de edição e senha. Desse aqui. Nós também adicionaremos ouvinte onComplete. E aqui vamos verificar se a tarefa foi bem sucedida. Vamos criar dosed, o que dirá inscrito com sucesso. Caso contrário, diremos que o ponto Ask obter exceção que recebe mensagem localizada. Então ele vai nos dizer o que deu errado. E é isso para o método de inscrição. E no método de login identificador. Queríamos dizer uma coisa semelhante, mas agora em vez de criar usuário com e-mail e senha, queremos usar login com e-mail e senha. Vamos usar os mesmos textos de edição para este e mesmo ouvinte OnComplete. E se deu errado, queremos receber a mensagem. Então é isso. Agora, queremos ter certeza de que o usuário tem entrada correta. Então, se o usuário, por exemplo, deixar vazios alguns dos campos, não
queremos lidar com a inscrição ou login. Ele vai primeiro aqui verificar se o e-mail. Está vazio ou a senha está vazia. E aqui, se estamos no modo de inscrição, precisamos verificar também o nome de usuário. Portanto, não queremos deixar o usuário se inscrever sem colocar o nome de usuário. Então, aqui devemos verificar se estamos no modo de inscrição e edD nome de usuário está vazio. Vamos colocar aqueles que dirão entrada inválida. E ouviremos o retorno. Portanto, o código abaixo não será executado. Agora vamos explicar isso em mais detalhes. Então, se estamos em atividade de login, por exemplo, no modo de login, na verdade esta é a mesma atividade. Nós não temos o campo de nome de usuário, e ele estará vazio por padrão. Então é por isso que precisamos separar a declaração CIF daqui. Então não poderíamos dizer ou EDTA nome de usuário está vazio porque nome de usuário deve estar vazio se estamos olhando para dentro. Então é por isso que ouvimos especificamente verificar se o estamos no modo de inscrição, só então verificar se o nome de usuário está vazio. Então vamos executar o aplicativo e ver como ele se comporta. Então aqui diz que o arquivo Google services.js ou está faltando. Para obter esse arquivo, precisamos abrir o Chrome. Você precisa abrir também o nosso projeto e clicar nas configurações do projeto aqui. E esse arquivo pode ser baixado daqui. E vamos fazer isso. Agora vamos copiar este arquivo. Eu já copiei, e eu vou apenas colá-lo nesta pasta aplicativo. Então vamos primeiro escolher o projeto para torná-lo mais claro. Abra esta pasta do aplicativo e cole-a aqui. Então, certifique-se de que é chamado assim. Então, por que precisamos deste arquivo é porque ele contém chave, ele contém basicamente informações sobre Project e sobre Firebase para que nosso projeto possa se comunicar com sucesso com o Firebase. Vamos agora tentar executar o aplicativo novamente. Também se certifica de adicionar permissão de internet dentro do arquivo de manifesto. Porque às vezes não vai funcionar. Se não tivermos permissão para a Internet, já que nosso aplicativo está usando a
Internet para fazer operações com o Firebase. Então agora eu preciso executar este aplicativo mais uma vez para que essas permissões de internet sejam aplicadas. Vou executá-lo agora. Se agora começarmos a digitar algo aqui e clicar em se inscrever, teremos mensagem de entrada inválida. Se criarmos algum usuário como este, e se clicarmos em se inscrever, temos uma mensagem que diz que o usuário está inscrito com sucesso. E vamos atualizar este console aqui. E temos nosso usuário autenticar com sucesso. Então, agora vamos verificar se o Login funciona. Então, vamos agora clicar no login. Se agora clicarmos em Login, ele diz que estamos logados com sucesso. Então, isso é bom. Então isso é para esta palestra.
4. Como criar a atividade de perfil: Nesta palestra, vamos aprender como fazer upload imagem de
perfil para o Firebase e associado com o usuário. Mas em primeiro lugar, vamos criar a atividade Amigos, que será atividade onde todos os usuários serão mostrados aqui. Então vamos primeiro criar essas atividades porque queremos ir para
a atividade de perfil onde queremos aplaudir imagem da atividade do amigo, amigo. Além disso, em primeiro lugar, crie essa atividade. Eles precisam de atividade de amigos. E clique em terminar. Agora vamos clicar nisso. Estou clicando em Mostrar interface do usuário do sistema. E basicamente o que queremos ter aqui, algum tipo de ícone onde podemos tocar e ir para o perfil. Então, para fazer isso, precisamos criar menu. Para criar um menu, vamos clicar com o botão direito do mouse na pasta restante. E agora vamos para o diretório de recursos novo e Android. Mude isso para o menu e clique em OK. Agora aqui, vamos criar um novo arquivo de recurso de menu. E vamos dar um nome. Divide-se o menu Perfil. E aqui queremos adicionar item, que terá ID do perfil do item de menu. Ele vai curar ícone, que será criado agora. Então vamos em drawable e criar um ativo vetorial. Vamos começar a procurar a conta. Então, escolhi este. Então podemos deixá-lo como está. Basta mudar o nome para a imagem da conta, e adicioná-lo aqui. E queremos mostrá-lo como ação sempre. Então agora estamos aqui tendo aviso, que é que devemos ter um título, mas não queremos nenhum título, já que ele sempre será colocado aqui. Agora vamos entrar na atividade do amigo e inflar esse menu. Então, vamos chamar no menu de opções de criação, na verdade vamos substituir esse método, que será chamado pelo sistema automaticamente. Vamos ter inflator menu e vamos inflar menu que acabamos de criar. E aqui queremos colocá-lo dentro deste menu, que é parâmetro aqui. E retornaremos verdadeiros. Então, queríamos ir para diferentes atividades assim que fizéssemos login com sucesso. E abriremos a atividade principal para isso. E quando lidamos com login, se for concluído com sucesso, iniciaremos a atividade da atividade
principal para a atividade do amigo. Nós também faremos a mesma coisa quando nós, quando formos assinados com sucesso. Então não queremos que o usuário esteja na tela. Quando nos inscrevemos, queremos traduzi-lo para a atividade do amigo imediatamente. Vamos agora executar o aplicativo e ver o que está acontecendo. Então vamos mudar para o login. Vamos colocar credenciais e clicar em login. Então estamos agora na atividade do amigo e temos o nosso item aqui. Então, já que estamos na atividade principal, vamos fazer mais uma coisa. E será quando esta atividade for criada. Aqui queremos verificar se o usuário já está logado. E se for, queremos enviá-lo. Queremos enviá-lo para a atividade do amigo. Então, para verificar se o usuário já está logado, tudo o que precisamos fazer é verificar se o usuário atual não é igual a null. Então é assim que funciona. E então aqui queremos terminar a atividade principal. Então, agora, se você executar aplicativo, novamente, seremos apresentados com esta atividade imediatamente. Como assim. Então, agora vamos colocar em ouvinte clique para este item de menu. E vamos fazer isso, substituindo no item de menu opções selecionado. E aqui queremos verificar se o item que selecionamos é o perfil do item de menu. E se for o caso, iniciaremos uma nova atividade, que será da atividade Amigos para a atividade do perfil. Mas precisamos criar atividade de perfil agora, já que ela não existe. Então vamos fazer isso. Nomeie seu perfil e clique em Concluir. Então, agora, se você for aqui, o erro se foi. Agora vamos executar o aplicativo para testar se ele funciona. Ok, agora, se clicarmos neste item aqui, estamos agora na atividade do perfil. Então, vamos agora projetar a atividade do perfil. Aqui queremos ter isso em torno dele imagem. Queremos ter dois botões para aplaudir e sair. E queremos ter textos que você aqui que serão usados para apresentar informações sobre o usuário atual, como e-mail. Então precisamos baixar cartões de você. Em primeiro lugar, agora podemos voltar ao design. Vamos colocar cartões que você, que será 180 DP largura e 180 dB altura. Terá um raio de canto de 90. E agora vamos fechar tag como esta para que possamos colocar imagem vista aqui. Será match_parent id da imagem será imagem de perfil. E podemos constrangê-lo assim. Precisamos de algum tipo de suporte aqui. E para isso podemos usar a imagem que criamos para o menu Perfil. Então vamos aqui usar essa imagem de conta como a imagem de origem desta visualização de imagem. E queremos que o tipo de escala seja centrado na cultura. Agora vamos abrir esta imagem e vamos realmente mudar a cor para o acento de cor. E vamos remover esta tonalidade para que
possamos, para que tenhamos o estudioso como aqui. Agora vamos adicionar botão, que será Wrap Content. Id será btn. Carregar imagem. O fundo será este. O texto será upload foto e cor do texto será branco. Então vamos colocá-lo aqui. Como este. Vamos adicionar roupa de cama a estes Botão. Agora vamos adicionar mais um botão para o login ou desculpe, para o propósito de login OUT. fundo será o mesmo, e ID será btn logout. Vamos mover este aqui. Então agora vamos adicionar algumas margens. Vamos adicionar aqui. Nós também vamos adicionar alguma margem aqui. E podemos mover este cartão para cima
alterando o viés vertical para o 0.4. Então, se você colocar 0.5. você vai tê-lo centrado. Se você colocar um, ele estará no fundo. E se você colocar 0, ele estará no topo. Então podemos usar algo assim. Então, agora vamos adicionar TextView. A cor será preta. Id será dxdy, informações
do usuário ou e-mail do usuário. Vamos colocar esse texto para você estar aqui. Vamos adicionar margem inferior, dB, 30 dB, assim. Então agora vamos executar o aplicativo para ver como ele fica em nosso emulador. Então eu tenho um erro porque eu esqueci de adicionar o P aqui. Vamos executá-lo de novo. Ok, então vamos clicar neste item e temos nossa atividade de perfil projetada. Então este vídeo está ficando longo e por causa disso, vamos continuar no próximo vídeo onde vamos ver como fazer upload de
dados do nosso usuário no banco de dados Firebase. Então, vejo você então.
5. Como fazer o upload de perfil no Firebase - Como trabalhar com o Firebase Storage: Agora queremos fazer upload de dados do usuário, como nome de usuário, e-mail e foto de perfil em nosso banco de dados. Então, vamos primeiro precisar para habilitar banco de dados em tempo real. E vamos clicar em criar banco de dados. E vamos iniciá-lo no modo de teste. Agora vamos abrir o Android Studio. Vamos abrir este assistente. E agora vamos integrar banco de dados em tempo real. Então, vamos clicar em salvar e recuperar dados. Agora, adicione banco de dados em tempo real ao aplicativo. E vamos fechar este assistente por enquanto. Abrir build-up Gradle para que possamos atualizar versão do banco de dados
Firebase para o mais recente, como este. E clique em sincronizar. Então, basicamente, quando nos inscrevemos aqui, queremos colocar alguns dados adicionais em nosso banco de dados. E que dados adicionais serão realmente objeto de usuário. Então vamos criar uma classe chamada usuário. Objeto de usuário, terá nome de usuário. Se tivermos e-mail. E terá uma foto de perfil. Então imagem de perfil também é uma string, que será na verdade um URL para a imagem de perfil que vamos, vamos carregar mais tarde. Então vamos criar, vai realmente gerar construtor como este. Nós também vamos criar um construtor vazio. Por causa da Firebase. Ele precisa dele para usar objetos diretamente. Em. Banco de dados. Operações também irá gerar getters e setters como este. Então, aqui, quando lidamos com o cadastro, se a tarefa for bem-sucedida, queremos acessar o banco de dados Firebase dot instância dot get reference. E esta referência será usuário. Então, quando colocamos o usuário aqui como referência, ele irá criar nó de usuário aqui. E que sobre isso, ele irá definir valor, que será um novo objeto de usuário com o nome de usuário que é passado neste método aqui. Ele terá este e-mail. E para a imagem do perfil, inicialmente será uma string vazia. Portanto, queremos que o usuário seja capaz de adicionar imagem de perfil mais tarde. E inicialmente ele terá um padrão como este. Mas aqui, como desreferência, cada usuário é único. E assim, queremos ter um nó central que será usuário. E depois disso, queremos ter algum tipo de ramo onde cada usuário será separado de cada um por algum tipo de identificador. E o identificador é realmente um que podemos obter
a partir do Firebase deve objeto com obter usuário atual, obter UID. E agora se executarmos nosso aplicativo, mas primeiro, agora vamos primeiro adicionar funcionalidade de logout para que possamos logout nosso usuário. Então, vamos por agora apenas inicializar botão Logout. E uma vez que o botão de logout é clicado, queremos que queremos sair. E também queremos iniciar uma nova atividade, que é a atividade principal. Mas também queremos limpar todas as atividades para que
possamos, para que não possamos voltar. E vamos fechar este. Então vamos agora executar o aplicativo para testar isso. Ok, então vamos clicar neste perfil. Vamos sair. E agora vamos criar um novo usuário. Então algum usuário aleatório. E vamos clicar em se inscrever. E vamos ver o que vai acontecer no banco de dados. Então temos um novo usuário aqui. Este usuário agora tem e-mail, nome de usuário e foto de perfil, que está vazio no momento. Agora você entende por que usamos aqui usuário e, em seguida, temos anexado com estes UID. Assim, desta forma, podemos ter vários usuários aqui. E se estivéssemos prestes a omitir essa parte aqui, estaríamos apenas excluindo esse usuário e criando um novo cada vez. Então vamos sair e criar mais um usuário. Vamos dizer algo assim. Clique em se inscrever. E então temos outro usuário aqui. Ok, então é assim que funciona. Agora é a hora de trabalhar em aplaudir a parte da foto. Então vamos voltar ao código e abrir a atividade do perfil. Então o que queremos fazer é que quando o usuário clica nesta imagem, queremos abrir a galeria com nossas fotos. E quando o usuário selecionar uma foto particular, queremos que ela aqui. E então, quando clicamos no upload, queremos que ele seja carregado no Firebase em algum lugar. Então vamos agora focar na primeira parte onde vamos obter a imagem da galeria aqui. Então, em primeiro lugar, vamos inicializar esta visualização de imagem. Por isso, vamos declará-lo em primeiro lugar. Ok, então isso é, é isso. Vamos definir OnClickListener para esta imagem. E aqui vamos abrir os sólidos da galeria, ver como é feito. Precisamos criar um novo objeto Intenção, que será chamado de intenção fotográfica. Será igual à intenção. Mas desta vez estamos especificando algo chamado ação. E essa ação é pico de ação. Então ele saberá que queremos escolher algo deste objeto de intenção. E isso será imagem. Por causa disso, precisamos especificar o tipo, que será fotografado. Corte asterix. Agora vamos começar a atividade, mas atividade para resultado, porque queremos obter imagem particular com o código de solicitação um. Então esta string aqui basicamente diz ao nosso sistema que queremos abrir a galeria. Então vamos executar o aplicativo e testá-lo. O que é atividade de perfil aberto e clique na imagem. Você pode ver que ele nos envia para a galeria onde podemos selecionar uma foto. Mas não temos nenhuma foto no nosso dispositivo. E por causa disso, precisaremos tirar algumas fotos mais tarde. Mas agora precisamos lidar com esses resultados. Então precisamos lidar com a nossa imagem de pico. Precisamos trazê-lo aqui de alguma forma. Para isso, vamos substituir método chamado no resultado da atividade. Aqui vamos verificar se o código de solicitação é igual a um. E o código do resultado é ok. Nós também precisamos verificar se os dados não é igual a nulo porque esses dados serão realmente imagem. E se tudo isso for o caso, obteremos imagem desses dados com data.dat. Dados. E agora precisamos armazená-lo em algum lugar. Para isso, precisaremos ter alguma variável global aqui. Se você quer saber qual é o tipo de dados que estamos recebendo? É URI. Então é basicamente pad para algum tipo de arquivo em nosso dispositivo. E vamos declará-lo aqui, URI
particular, imagem Pat. E aqui, vamos atribuir esses dados a esta imagem Pat, assim. Agora, o que precisamos fazer é obter imagem na visualização de imagem. E vamos criar esse método aqui. Então, será nulo. Vamos precisar de bitmap. E que bitmap será basicamente imagem que vamos obter a partir destes aposta imagem. Então, para fazer isso, precisamos chamar a loja de mídia, images.me, dot get bitmap. E aqui precisamos de resolver conteúdo. E usaremos nossa aposta de imagem para obtê-lo. Portanto, é difícil lembrar de tudo isso. Você nem precisa se lembrar disso. Basta simplesmente Google sobre como transformar URI em um bitmap e você vai encontrar algo como isso. E agora, quando temos a nossa imagem aqui, queremos configurá-la para o nosso perfil de imagem. Então, vamos nos referir ao perfil de imagem e vamos definir bitmap imagem. Este bitmap. Agora você pode ver este subjacente aqui. E isso está nos dizendo que devemos lidar com exceção se basicamente nossa imagem não for encontrada. Então o que vamos fazer é simplesmente seguir mais ações e podemos cercar isso. Tentamos pegar o bloco. E é isso. Portanto, se a imagem não for encontrada, nosso aplicativo não trará. Agora, vamos executar nosso aplicativo e testar como ele funciona. Em primeiro lugar, temos de tirar algumas fotografias para as ter na nossa galeria. Então vamos abrir a câmera do nosso emulador. Ok, vamos, ok, vamos capturar este aqui. Agora vamos voltar e vamos abrir nosso aplicativo. Então, quando abrimos perfil e clicar sobre isso, agora
teremos fotos. Então vamos escolher um. E você pode ver que nossa foto está aqui. Então, resolvemos com sucesso a primeira tarefa. E a segunda é aplaudir essas fotos no Firebase. Então, como fazemos isso, onde fazemos nós realmente aplaudimos essas fotos. Para isso, precisaremos usar o armazenamento Firebase. Então, na verdade, armazenamento é algo onde podemos carregar arquivos no Firebase. E, para isso, precisaremos incluir dependências primeiro. Então vamos abrir nosso assistente de assistência Firebase. E vamos clicar no armazenamento. E clique nisto. E vamos adicionar armazenamento em nuvem ao nosso projeto. Enquanto ele está sendo construído, vamos abrir um navegador da Web e habilitar o armazenamento. Então, vamos clicar em começar. Vamos clicar em Avançar. Clique em Concluído. E estes serão nosso armazenamento de banco de dados. E aqui podemos fazer upload de arquivos. Então agora vamos voltar ao código e ver como fazer isso através do aplicativo. Agora, vamos definir OnClickListener para estes botão foto upload. Mas vamos precisar declarar e inicializá-lo primeiro. Então vamos colocá-lo aqui, e vamos inicializá-lo aqui. Vamos definir OnClickListener para estes botão. E quando clicamos neste botão, queremos fazer upload da imagem. Então vamos criar esse método abaixo. Agora, quando começamos a aplaudir tarefa, queremos mostrar algum tipo de progresso dessa tarefa para o usuário, e que será ProgressDialog. Assim, criaremos um diálogo sobre o progresso. Contexto será esta classe. Vamos definir o título desse progresso para os três pontos aplaudindo. E queríamos mostrar esse diálogo. Finalmente. Agora aqui queremos obter referência do armazenamento para que possamos aplaudir essas imagens e vamos ouvir chamada Firebase,
armazenamento, ponto getInstance, obter referência e referência. E serão imagens com algum tipo de string aleatória que será gerado desta forma. Então isso vai nos dar alguma corda aleatória. Qual será o nome da foto que queremos enviar. E dessa forma, podemos colocar várias fotos sem sobrescrever. Então não há chance de termos o mesmo nome para algum tipo de foto. E quando aplaudimos esta foto para o armazenamento, precisamos associá-la aos nossos usuários de alguma forma. E você verá em um momento como faremos isso. Então, aqui agora vamos dizer colocar arquivo. Arquivo será a nossa imagem PET. E queremos colocar em ouvinte completo para que saibamos quando completa, quando a tarefa de upload é concluída. E se a tarefa foi bem sucedida. Agora vamos descartar a nossa caixa de diálogo de progresso. E, em seguida, vamos enviar a mensagem do fazer, que irá dizer imagem carregada. Senão. Vamos dizer que algo deu errado com a mensagem correspondente. Mas também precisamos descartar ProgressDialog de qualquer maneira. E por causa disso, vamos simplesmente mover isso aqui para que até nossa tarefa tenha sido bem sucedida ou não. Teremos a certeza de que o diálogo sobre o progresso será rejeitado. Vamos agora executar o aplicativo e testar como isso funciona. Agora vamos abrir a atividade de perfil. Vamos colocar alguma imagem aqui. E vamos clicar no upload. Foto. O aplicativo está travado. E vamos ver por que é isso. Portanto, o erro é provavelmente porque quando colocamos a dependência do armazenamento Firebase, ele está desatualizado. E devemos atualizá-lo para a versão mais recente possível. Porque você pode ver que ele diz que não há nenhum método que é usado dentro do armazenamento firebase. E vamos mudar isso para a versão mais recente. E depois de sincronizar projeto vai tentar novamente. Então vamos executar o aplicativo agora e ver como vamos trabalhar. Então, vamos selecionar Foto. Mais uma vez. Vamos clicar no upload da foto. E diz que imagens carregadas. Então, vamos atualizar esta página em nosso navegador da web. Você pode ver que há imagens de pasta que criamos. De qualquer lado, há uma imagem com essas strings aleatórias que nós geramos. Então está funcionando, está funcionando. Está bem. Agora o que nós queremos fazer é que nós queremos manter o controle de quanto de nossa foto é enviada. Então queremos algum tipo de porcentagem dos dados carregados. Então, para fazer isso, vamos precisar colocar em ouvinte progresso aqui. E quando essas mudanças de progresso, vamos atualizar nosso diálogo de progresso com este texto para que o progresso será variável dupla, que será igual a 100 multiplicado pelo ponto instantâneo. Obter bytes transferidos. Dividido por ponto Snapshot obtém a contagem total de bytes. E quando tivermos esse progresso, atualizaremos
a mensagem para algo assim. E vamos converter o este progresso para inteiro. Nós também adicionaremos sinal de porcentagem. Então vamos agora executar o aplicativo e ver se isso funciona. Bem, agora está aberto este perfil. Vamos aplaudir mais uma vez algo que você pode ver aqui que nós temos progresso, mas você pode notar que ele saltou direto, direto para o 100%. Isto provavelmente porque a nossa imagem é muito pequena, por isso terminou rápido. Eu acredito que se a imagem for maior, ela funcionará bem. Agora é a parte em que queremos associar esta imagem a um determinado usuário que carregou esta imagem. Então, para fazer isso aqui, quando a tarefa for bem sucedida, precisaremos obter URL desta imagem. E, em seguida, vamos colocar esse URL em nosso banco de dados em vez de que cadeia vazia que temos aqui. Então aqui temos string vazia. Vamos atualizar esse campo com o URL correspondente para obter download, download URL. Para obter o URL a partir do qual esta imagem pode ser feito carregado, vamos nos referir a essas tarefas. Vamos conseguir um resultado. Em seguida, vamos obter armazenamento e obter URL de download. Então isso também leva algum tempo. Basicamente este URL de download estará disponível somente quando estes, estes tarefa de obter armazenamento e obter este URL é concluída. Então vamos precisar adicionar mais um no centro completamente aqui. E quando isso for concluído, se a tarefa for bem sucedida, vamos atualizar a imagem do perfil do nosso usuário. E vamos colocar argumento aqui, que será a URL exata. E agora que URL é simplesmente um resultado desta tarefa, e esta tarefa realmente está recebendo URL de download. Então agora vamos criar um método aqui e vamos ver como ele funciona. Então estamos passando URL string. Então agora precisamos colocar este URL string aqui. E é assim que será feito. Então temos que colocar de alguma forma em nosso banco de dados para este campo de imagem de perfil. E aquele Pat é este. Então, vamos primeiro referido a Firebase Database GetInstance e obter referência. Aqui dentro. Vamos colocar pet para esta foto de perfil e que morcego é usuário. Então temos barra de usuário. Agora precisamos obter o UID de usuário específico. Vamos obter isso a partir do objeto antigo Firebase e obter usuário atual, obter UID. E agora tudo o que precisamos fazer é escrever uma foto de perfil. Então estamos aqui agora. E para colocar finalmente esse URL, vamos apenas definir o valor e vamos escrever URL. Então agora vamos executar o aplicativo e ver se ele funciona ou não. Vamos abrir o perfil. Bem, agora é imagem de upload. Clique em carregar foto. E quando a imagem é carregada, temos a nossa imagem aqui. Então por que temos corda aqui, por que fizemos isso? Isso porque mais tarde vamos inflar nossa visão de imagem
do perfil de nosso usuário com esta string. Então, vamos usar biblioteca deslizar para inflar nossa visão com esta imagem. E se você copiar este link e colá-lo aqui, você pode ver que nós temos a imagem. Agora você aprende como carregar uma foto ou qualquer arquivo praticamente no Firebase e associá-lo ao nosso usuário. Então, no próximo vídeo, vamos ver como buscar uma lista de todos os usuários. Então, estou vendo você.
6. Como criar a atividade de amigos - Como fazer os usuários do Firebase: Agora é a hora de projetar a atividade de
nossos amigos e buscar uma lista de todos os usuários no Firebase. Então vamos precisar de visão recicladora onde vamos colocar todos os usuários. Por causa disso, vamos primeiro precisar baixar o componente de visão recicladora. Agora vamos voltar para a codificação aqui. Para o fundo do nosso layout raiz irá colocar gradiente. Aqui queremos barra de progresso, que será 200 dp de altura e largura, colocará ID para ser barra de progresso. E vamos movê-lo para o centro. E é isso. Agora vamos colocar vista recicladora. Visualização Recycler será basicamente corresponder ID pai de que será reciclador. Mas inicialmente queremos que a
visão recicladora desapareça porque queremos exibir uma barra de progresso primeiro. E quando obtivermos dados, vamos ocultar esta barra de progresso e vamos mostrar visão recicladora. Agora vamos e criar adaptador para a nossa visão recicladora irá criar nova classe que será chamado adaptador de usuários. Ele irá estender o adaptador de ponto de vista do reciclador. Vamos criar aqui interclass, que será o nosso detentor de visão. É titular do usuário e extende o detentor.edu. Aqui precisamos gerar construtor. E vamos ouvir no tipo de ser do nosso titular usuário. Agora precisamos implementar métodos que são necessários para se livrar dos erros. Dentro destes adaptador, vamos precisar ArrayList dos usuários. Ele será chamado de usuários. Vamos armazenar usuários objetos de usuário aqui. Precisaremos de contexto. E nós também vai precisar de algum tipo de interface para clique evento. Ouvir são realmente passar eventos de cliques para a atividade de nossos amigos para que
possamos responder eventos onclick. E vamos ouvir criar uma nova interface que será chamada On user click listener. Ele terá método chamado no usuário clicado. E vamos passar posição do usuário que é clicado, posição dentro destes ArrayList. Para que na atividade do amigo saibamos qual usuário é realmente clicado. Agora vamos adicionar essa interface aqui. E agora vamos criar construtor com esses três parâmetros. Vamos agora criar suporte vista. Será View, que é igual ao inflator layout do ponto de contexto inflate. E precisamos criar o nosso titular do usuário dentro do layout. Então agora vamos projetar uma linha que será exibida na atividade de nosso amigo. Layout raiz será cartões que você. Será conteúdo envolvente. Para a altura. Vamos dar algumas margens aqui. Assim, a margem horizontal será de dez dB. Margem superior será de dez dB. Então, queremos ter espaço entre linhas de usuário e raio de canto será 40 DP, 14. Aqui teremos layout linear que será combinado trigo pai acolchoado fora 70 b. Vamos fechar tag desta forma. E aqui queremos ter outra exibição de cartão porque queremos ter nossa foto de perfil em torno dele. Então, vamos usar tarik com vista Descartes e raio de canto para obter imagem de terra. Então aqui está a imagem, que vai manter o nosso perfil como vamos buscar a partir da base de fogo. Idéia de que será imagem proff e tipo de
escala desta imagem será centrado corte para que possamos ter a nossa imagem cortada dentro do fundo círculo destes vista cartão. Na verdade, a cor de fundo será a cor primária. E também precisamos ter visualização de texto aqui, que exibirá um nome de usuário do nosso usuário. Então vamos colocá-lo aqui abaixo vista de descartar. Será conteúdo envolvente. ID, techs dx, t, nome de usuário. A cor do texto será branca. Vamos colocar alguma margem esquerda aqui. E a gravidade estará no centro, modo que agora voltará ao nosso adaptador. Vamos ouvir inflado estes titular usuário vai colocar os pais e não queremos anexá-lo para escreveu. E devolveremos um novo titular de utilizador com esta vista. Aqui, queremos obter o tamanho ponto-ponto de um usuário. E no suporte de visualização OnBind, vamos definir os dados para o nosso layout que acabamos de projetar. Então, em primeiro lugar, deixe ir neste suporte de vista e colocar vista de
texto e imagem que
acabamos de adicionar em nosso arquivo XML. Então aqui vamos inicializar esses TXT nome de usuário. Então esta é a exibição de texto, e agora precisamos inicializar essa visualização de imagem. E na ligação você método titular é chamado quando queremos inflar os dados em nosso layout. Então vamos nos referir a estes. O nome de usuário. Vamos definir texto para os usuários ponto obter posição, ponto obter nome de usuário. Vamos ponto-e-vírgula aqui. Se não o fizesses. Se você quer saber agora como inflá-lo, esta visão de imagem com imagem de perfil, precisamos usar deslizar. Então abra seu navegador da web e procure por dependência deslizante. Então abra este link e copie-os para voltar para o estúdio Android. E aqui, basta colá-lo e clicar em sincronização. Agora, vamos voltar para o adaptador e consultar estes deslize twit contexto de carga. Para obter o URL da imagem, precisamos nos referir aos usuários ArrayList. Vamos ter usuário específico, a posição e vamos ter foto de perfil. Se você, se você não se lembra, este é o metal que estamos nos referindo. Então, estamos basicamente obtendo-o a partir do objeto de usuário, que está no Firebase. Aqui vamos especificar qual imagem será inflado caso ocorra o erro. Então essa imagem será essa imagem. Agora aqui, precisamos colocar um suporte de lugar. E é, Eu acredito que não
há erro, mas a imagem não é buscada porque não existe. Ou se a URL não for válida. Vamos colocar a mesma imagem. E, finalmente, vamos inflá-lo em vista de imagem de ponto titular. Então é isso. Nosso adaptador está terminado. Vamos voltar para a atividade do amigo e L. Na atividade da França precisamos declarar visão recicladora. Vamos precisar de matriz uma lista de usuários. E, em seguida, adaptador de usuário barra de progresso que acabamos de criar. Usuários adaptador ponto OnClickListener. Então estamos nos referindo à interface que colocamos aqui. Agora, no método OnCreate, vamos inicializar alguns desses. Então vamos inicializar barra de progresso. Usuários ArrayList, visão recicladora. E no usuário clique ouvinte será igual a novos usuários adaptador ponto no novo usuário clique ouvinte. Esquecemos basicamente de definir o ouvinte de amostragem em nosso item. E vamos fazê-lo aqui neste construtor. Então, vamos aqui apenas dizer ponto de vista do item SetOnClickListener, novo OnClickListener. E aqui vamos chamar estes no usuário clicado, assim. No usuário clicou e obter a posição do adaptador. Então nos referimos a esta interface, a estes ouvinte clique do usuário. E porque inferências atividade, vamos passar este ouvinte clique para construtor do nosso adaptador. Quando clicamos aqui algo, isso aqui será acionado e saberemos que o usuário é clicado. Então, vamos por agora colocar mensagem do brinde que dirá tocado no usuário. E vamos obter usuário por esta posição, e vamos obter nome de usuário desse usuário. Agora vamos precisar buscar usuários alguma forma e vamos criar um novo método para, para esse fim. Vamos nos referir ao banco de dados Firebase dot GetInstance chegar ao usuário de
referência. E vamos acrescentar. Um ouvinte para um único evento, assim. Então, aqui, vamos usar para loop para obter nossos usuários. Então, para instantâneo de dados, neste instantâneo, ponto obter filhos. Basicamente obter crianças vai nos dar uma lista desses itens. Então este é, este será o primeiro filho, este será o segundo filho neste para loop. Então vamos adicionar essas crianças, mas precisamos obter o valor e esse valor será objeto é em si. Assim, desta forma, quando estes Primeiramente entra em for-loop, Primeira vez, teremos este objeto de usuário. Daqui. Da próxima vez teremos este, e assim por diante. Quando isso for concluído, vamos criar usuários adaptador, trigo, usuários ArrayList. Nós clicaríamos em ouvinte que é especificado aqui. E a atividade é essa. Então vamos ver se a ordem está correta. Então precisamos mudar de lugar aqui. Vai ser assim. Agora queremos definir o gerenciador de layout da nossa visão recicladora para o gerenciador de layout linear. E vamos definir adaptador para ser este. Agora, o que precisamos fazer é definir a visibilidade da barra de progresso para arma, e visibilidade da visão recicladora para visível. Então, quando abrimos nosso aplicativo, quando
abrimos essa atividade, chamaremos usuários como este. Então vamos executar o aplicativo e ver se ele funciona. Então agora aplicativo está em execução e você pode ver que a barra de progresso está girando porque ele ainda não buscar os dados. E uma vez que os dados são obtidos, progresso desapareceu e temos dois usuários do nosso banco de dados. Agora vamos ver como implementar deslize para atualizar coisa. Quando puxamos, quando chamamos clique e puxe de cima para baixo, queremos buscar usuários mais uma vez. Então também, você pode ver que quando clicamos no usuário, temos mensagem do brinde que definimos aqui. Então, para implementar o furto para atualizar, vamos precisar, vamos precisar procurar isso no Google porque é biblioteca. Se clicarmos nisso, podemos encontrar facilmente. Código de implementação e que será colocado em Gradle build-up. Atualizaremos isso para a versão mais recente e sincronizaremos. Agora. Agora vamos voltar para a atividade de amigos. E aqui, precisamos usar esses deslize para atualizar o layout. E deve ser layout raiz. Então vamos começar a digitar o layout de atualização de deslize. E precisaremos mover nosso layout de restrição para estar abaixo. Então ele será match_parent e estará cercando todos aqueles dentro. Mas o layout de restrição em si será cercado com o deslize para atualizar, com o layout de atualização de deslizamento. Então aqui temos um erro. Fizemos, Nós não temos imagem real porque o aqui apenas injetou estes layout atualização 5p e Android Studio ainda não está pronto, mas confie em mim ele funciona. Vamos definir algum ID aqui para
que possamos referi-lo inferências atividade, vamos ouvir declarar, sobreviver, atualizar layout. Vamos inicializá-lo aqui. E vamos definir no ouvinte atualização. Basicamente, quando puxamos de cima para baixo, este metal aqui será acionado. E o que vamos fazer, vamos chamar novamente obter usuários. Mas vamos ver o que acontecerá se executarmos o aplicativo agora mesmo. Se puxarmos assim, começará a girar indefinidamente. E o, temos valores duplicados aqui. Então, para resolver o primeiro problema com fiação indefinida, depois que esse método é chamado, precisamos definir o layout de atualização de deslizamento, definir a atualização como false. E agora ele vai parar de refrescar depois de puxá-lo. Mas para evitar que esses dados sejam duplicados. Aqui, em primeiro lugar, temos de limpar todos os dados da nossa base de dados de utilizadores. Porque lembre-se obter usuários que dizemos isso é que apenas anexar nossa lista de usuários com os mesmos dados. Então, agora, quando executarmos o aplicativo, ele será corrigido. Então vamos ver. Ok, então vamos agora puxar e você pode ver que tudo está funcionando como esperado. No próximo vídeo, vamos trabalhar na atividade da mensagem, e vamos finalmente ver como enviar mensagens de usuário para usuário.
7. Mensagens - Final do ChatApp: Agora é a hora de criar atividade de mensagem. Então vamos entrar aqui e criar uma nova atividade vazia. Vamos dar um nome de atividade de mensagem. E clique em terminar ou pressione a tecla Enter. E vamos primeiro projetar XML. terreno traseiro será gradiente. Vamos colocar layout linear aqui, que será o pai da correspondência, e a altura será 75 dp. Então, o que queremos fazer com este LineARLayout, e basicamente queremos que estes layout linear para ser em vez desta barra de ferramentas aqui. Então, em primeiro lugar, vamos precisar remover essas barras de ferramentas aqui. Para isso, precisaremos definir um novo estilo aqui. Esse estilo será estilo. Dizemos à barra de ferramentas. Os pais serão, na verdade, este. As cores serão as mesmas que as cores desta equipe. Mas a diferença é que não queremos barra de ação. Agora,
no arquivo do manifesto , aqui, vamos aplicar. E essa equipe que acabamos de criar. Então, agora para atualizar esses layouts, tudo que você precisa fazer é clicar aqui e clicar em forçar atualização layout. Nosso layout ainda não foi atualizado por algum motivo, provavelmente por causa de alguns bugs no Android Studio. Mas se voltarmos para a atividade de amigos, vamos iniciar essa atividade de mensagem para ver se ela realmente não tem ActionBar, ou está nisso, ou é como nesta visualização. Então, vamos apenas abri-lo a partir daqui quando clicamos em algum usuário. Então vamos rodar o aplicativo. Se clicarmos no usuário, vemos que não há nenhuma barra de ferramentas como esperado. Mas, por algum motivo, Android Studio é buggy. Então você pode tentar fechar e abrir o Android Studio. Mais uma vez, se acontecer com você também. Então, vou trabalhar como está, porque não me incomoda muito. Sei que vai funcionar bem. Então eu vou continuar. Estamos trabalhando com isso. Então fundo destes LinearLayout será cor secundária. Sua orientação será horizontal. E eu vou precisar fechá-lo desta maneira porque eu quero colocar alguns itens aqui. Esses itens serão vista de cartão. Tínhamos 55 DP para largura e altura. A gravidade será o centro. E aqui eu quero visão de imagem, que será correspondente pai. E esta imagem será basicamente imagem de perfil do usuário, que está conversando com a gente. Adicionaremos Raio de Canto a 44 DP, por exemplo, para torná-lo redondo. Id da barra de ferramentas da imagem. E o tipo de escala será centrado na cultura. Por padrão, a imagem de origem será esta. Então podemos fazê-lo desta forma. Também. Ao lado dessas imagens de perfil, queremos ter texto para você, que mostrará o nome de usuário do usuário que estamos conversando com ele. Assim, podemos ser embrulhados conteúdo. Vamos adicionar uma margem esquerda, e vamos fazê-lo para estar no centro. Você pode ver neste projeto também, onde ele será posicionado. Agora precisamos adicionar ID fiscal, que será TXT, conversando com, por exemplo. Agora precisamos projetar esta parte aqui. Então vamos colocar uma barra de progresso que será 200 dp. Será centrado no meio. Vamos restringi-la. Vamos constrangê-lo assim. Id de que serão mensagens de progresso. Precisamos colocar a visão do reciclador aqui também, que será 0 dP. Largo e alto, porque vamos restringir mais tarde a algum ID de Componente será mensagens recicladoras. E abaixo desse reciclador, queremos editar texto. Vamos colocar alguma largura aleatória por agora porque nós também vai restringir é algo ID será edD texto. E, por enquanto, será uma restrição como esta. Precisamos dar algum fundo,
algum fundo personalizado para este texto de edição. E vamos criá-lo aqui. Então vamos colocar, vamos chamá-lo de entrada de mensagem, fundo. Vai ficar em forma. Tínhamos cor sólida do estudioso. Vamos adicionar um raio para ser 13 dp. Vamos aplicar isto. Então também precisaremos de visualização de imagem aqui, que será usado para enviar mensagens. Então vamos criar um ativo vetorial para isso. Vamos clicar e procurar sentido. Então será este. Imagem de areia será o nome. E termine. Agora vamos aqui colocar essa visão de imagem com dimensões de 40 dB. Vamos movê-lo para aqui. Precisamos colocar a fonte desta imagem para ser imagem de areia. Então vamos restringi-la assim. Agora, vamos restringir editar texto para esta visualização de imagem. Agora, para a largura, vamos colocar 0 para a altura. Será uma coisa interessante. Então vamos deixar essa altura para ser conteúdo envolvente. Mas vamos definir altura mínima, este texto de edição para 45 dp e altura máxima será de 100 dB. Então, o que isso significa? Isso significa que este EditText não pode ser menor, pode ser menor que 45 dp. E quando começamos a digitar mensagens, ele será expandido porque esses atributos aqui é conteúdo envolvente. Uma vez em expansão. Alcance 100 dp. Não será mais expandido. Então é por isso que usamos a altura mínima e máxima. Preenchimento vertical será dez dp e preenchimento horizontalmente e B será 20 db. Então agora o que precisamos fazer também é definir a margem na parte inferior para dez dp. E também vamos colocar margem inferior para esta visão de imagem para algo assim. Então você também pode modificá-lo um pouco para que você possa colocar margens horizontais para nove DP, por exemplo, para alcançar esse visual. Ou como quiser, você pode até expandir. Você pode até aumentar esse raio de canto para conseguir algo assim. Agora vamos voltar a esta visão recicladora. Queríamos que esta visão recicladora fosse uma restrição na parte inferior para isso e
o topo deveria estar aqui. Então, agora podemos alterar a largura dessa visão recicladora para corresponder ao pai. E aqui teremos mensagens. Mas inicialmente a visibilidade desaparecerá. Porque quando recebemos as mensagens, vamos expandi-lo e vamos esconder barra de progresso. Então agora vamos executar o aplicativo e vamos ver como ele se parece. Vamos abrir isto. E este é o layout. Ele vai, ele vai girar para sempre porque nós não temos qualquer lógica em nossa atividade de mensagem em código Java. Por isso, vamos trabalhar agora nisso. Então vamos abrir a atividade da mensagem e inicializar todos os componentes. Então, temos visão recicladora. Então temos EditText para inserir uma mensagem. Temos TextView. Este vinho aqui. Vamos chamá-lo dxdy, conversando com. Teremos uma barra de progresso. Iremos agora inicializar todos eles. Mãe, vamos inicializar o texto ADT. Eu acredito. Este é o tal, então sim. Agora mande um SMS para você. E barra de progresso. Então é este. Agora o que precisamos fazer é criar objeto de mensagem. Então objeto de mensagem terá seguintes atributos. Remetente, que será string. Ele terá receptor de mensagem e o conteúdo da mensagem. Então vamos agora criar construtor. Vamos criar getters e setters. E vamos criar um construtor vazio por causa do Firebase como este. Então aqui também
teremos ArrayList de mensagens. Vamos inicializá-lo aqui. Esquecemo-nos de adicionar esta vista de imagem aqui. Então vamos fazer isso agora. E vamos inicializá-lo aqui. Também temos esta imagem para enviar mensagem. É este aqui. Então, ele vai mudar seu ID para a mensagem de envio IMG. Mude isso aqui também. E vamos inicializá-lo aqui. Agora precisamos voltar para a atividade do amigo. E quando clicamos em determinado usuário, vamos excluir esta mensagem do sistema. E o que queremos fazer é iniciar a atividade da Mensagem, mas precisamos passar alguns itens aqui também. Então vamos colocar um nome de usuário extra de, digamos, um companheiro de quarto. Porque basicamente temos salas de chat. Você verá como criamos o mais tarde e isso será feito, digamos. Este será users.js ainda obter posição e obter,
obter nome de usuário de seu companheiro de quarto. Porque quando buscamos lista de usuários, quando clicamos em determinado usuário, queremos transferir seu nome de usuário para a nossa atividade de mensagem. Basicamente, se você quiser conversar com John, quando clicarmos em John, John, nome de usuário será transferido aqui. E nós seremos capazes de colocar esse nome de usuário aqui, por exemplo. Mas vamos primeiro aqui colocar todos os dados que precisamos. Também precisamos do e-mail do colega de quarto. E vamos conseguir assim. Então vamos colocar imagem de colega de quarto. E queremos ter a nossa própria imagem. E agora com a pergunta como obter nossa própria imagem. Então vamos ouvir variável string especificada, que será a minha imagem, URL. E aqui, quando buscarmos os dados, vamos definir essa imagem. E como fazer isso. Em aqui, vamos precisar ir em estes obter métodos usuários. E depois de fazer tudo isso, irá simplesmente loop através de
todos os usuários que temos buscado. E vamos verificar se usuário dot get e-mail é igual a Firebase deve ponto, instância, ponto obter usuário atual. Nós recebemos e-mail. Então este é o nosso e-mail. E aqui estamos verificando se nosso e-mail é igual ao e-mail do usuário da lista de usuários. E isso é porque essa lista de usuários, essa lista de usuários. Quando for inflado, acontecerá que também nosso objeto, nosso próprio perfil será armazenado aqui. Então, mais tarde aqui, vamos percorrer todos esses objetos e queremos nos encontrar. E se esse for o caso, minha imagem é igual à foto do perfil desse usuário porque este somos nós. E ouviremos o retorno porque se nos
encontrarmos, não queremos mais fazer loop. Para salvar alguma memória. E por causa do desempenho, não
precisamos lope mais tarde se já nos encontramos. Então vamos colocar, então
vamos colocar essa imagem também. Assim como. Então agora podemos voltar à nossa atividade de mensagem. Aqui vamos colocar algumas cordas. Será, será o nome de usuário ou o colega de quarto. Então teremos conversando com o usuário. E teremos a identificação da sala de bate-papo. E você vai ver mais tarde como vamos obter o ID do quarto e o que é realmente. Por enquanto, vamos primeiro obter nome de usuário ou um colega de quarto de get intento dot getString extra. E esta é a corda. Agora vamos começar a conversar com o usuário. Na verdade, vamos mudar isso para e-mail de um colega de quarto. Temos erro de digitação aqui, então precisamos consertar isso também. E agora vamos aqui definir a largura para ser nome de usuário, o companheiro de quarto. Então agora basicamente definimos este texto aqui com o usuário que estamos conversando. Então, agora é a parte difícil de entender no início, talvez precisemos montar um quarto de calado. Então por que fazemos isso e o que é. Portanto, a lógica de manter nossas mensagens no Firebase será a seguinte. Então aqui ao lado do usuário, não
teremos chamado mensagens. E quando expandirmos isso não, teremos uma identificação de quarto. Então vamos imaginar que nós temos Max e nós temos Alex, e eles estão conversando, que um com o outro. Então, basicamente precisamos gerar algum tipo de ID, que será ID da sala de bate-papo. Para Max e Alex, precisamos apenas de um quarto para dois usuários diferentes. E não importa se Lx está enviando mensagens para o máximo primeiro ou máximo para Alex, essa linha deve ser única. Então, para gerar esse tipo de ID, a coisa mais fácil a fazer é. Faça algo com os nomes de nossos usuários. Então, basicamente, nosso ID de sala de bate-papo deve ser composto de nomes de usuário dos usuários nessa sala de bate-papo. Então, como fazer esse nome único? Então, basicamente, vamos comparar um nome de nossos usuários e alfabeticamente, vamos gerar esse tipo de nome. Então, se tivermos Max e Alex, conversando, o nome do nosso quarto deve ser como palhaços. E então vamos voltar para a base de fogo, vai ouvir ter mensagem não é. É melhor se eu mostrar-lhe como ele funciona no aplicativo que eu criei antes de gravar esses tutoriais. Então isto é, nós temos usuários e mensagens não e se expandirmos esta, essas são basicamente salas de bate-papo. Então, quando temos John Wayne ou com Max se comunicando, vamos gerar John Wayne max chatroom, e ele irá conter mensagens objetos. Ele conterá objetos de mensagem. Então, cada um desses são objetos de mensagem que criamos, que criamos antes. Então temos remetente, receptor e o conteúdo da mensagem. Por isso, desta forma. Se John começou a conversa primeiro, vamos ter este errado criado com este ID, que é basicamente nome, que é composto de dois nomes de usuário. E se o Max começar a polarização, em primeiro lugar, este Romain também será o mesmo. Assim, desta forma, estamos a evitar duplicar quartos e estamos a poupar espaço na base de dados. Então talvez pareça um pouco difícil de entender. Mas quando começamos a criá-lo, e quando você vê como ele realmente funciona na prática, será muito mais fácil. Então vamos criar um método chamado chatter de configuração. Oh, então vamos ouvir referido ao usuário. Vamos precisar de um UID de nós mesmos. Vamos adicionar ouvinte para único evento. Então, agora, quando vamos para o ID, vamos ter o nome de usuário de nós mesmos. Esse nome de usuário é. Ponto instantâneo obter usuários de valor, essa classe, user_data classe realmente e obter nome de usuário. Então aqui temos nosso nome de usuário. Então precisamos comparar este nome de usuário com o nome de usuário do nosso colega de quarto para que possamos saber qual nome irá primeiro e qual nome irá por último. E vamos compará-lo assim. Então, se o nome de usuário do roommate.com, meu nome de usuário é maior que 0, isso significa que nosso nome de usuário será o primeiro e o nome de usuário do companheiro de quarto será o último. Portanto, o ID da sala de bate-papo será igual a este. Caso contrário, se o nome de usuário do companheiro de quarto se compara ao nosso nome de usuário é igual a 0, isso significa que basicamente os nomes de usuário são os mesmos e alfabeticamente sua ordem será a mesma. Então, é basicamente comparando. Se nós aqui temos Macs em comparação com Alex, Ele vai ver 0s antes de um no alfabeto. Então, no início, ele pode ver que este não é o caso, é que vamos retornar número que é maior do que 0. E nós vamos ter isso como o nome de usuário. Aqui. Isso acontecerá se tivermos usuários, Alex, Alex. Então ele irá comparar a a a,
em seguida, ele irá comparar L2, l, e assim por diante. Se ele determina que todos têm a mesma ordem, ele retornará 0. Então, neste caso, não importa como concatenamos esses. Podemos fazer a mesma coisa que fizemos antes. E outra coisa. Isso significa que o ID da sala de bate-papo precisa ser composto assim. Portanto, seu nome de usuário do usuário com o qual estamos conversando precisa ser o primeiro. Agora o que precisamos fazer é que precisamos anexar mensagem, ouvinte e ele também irá inicializar esses grupos. Até agora estamos apenas recebendo os dados e não estamos escrevendo nada para Firebase. E o que quero dizer por anexar ouvinte é que precisamos colocar um ouvinte para NADH específico. E quando a mensagem é alterada aqui, quando recebemos alguns dados, precisamos notificar nossa atividade e ela vai buscar novas mensagens. Então vamos criar esse método. Ele vai obter, ele vai precisar basicamente de ID de sala de bate-papo. Vamos definir e pelo menos em nossas duas mensagens mais chat id dot add. Agora precisamos, estamos agora queremos obter um ouvinte de evento de valor não único. Porque se você colocar único, Nós não serão notificados sobre alterações de dados. E desta forma, na mudança de dados será acionada toda vez que uma nova mensagem é recebida. Então, quando recebemos novas mensagens, em primeiro lugar, queremos limpar mensagens anteriores. E para instantâneos de dados. Em instantâneo obter filhos. Vamos adicionar mensagem à nossa Messages ArrayList. Então estamos fazendo coisas semelhantes como fizemos quando estávamos adicionando usuários. Então, depois de cada vez que buscamos novas mensagens, queremos rolar para a última mensagem que é recebida. Portanto, é o tamanho de todas as mensagens menos1. Por isso, queremos manter as mensagens no fundo. Então, queremos, quando recebemos nova mensagem, visão
recicladora será automaticamente rolada para baixo. Você verá que, na prática, queremos definir a visibilidade da nossa visão recicladora para visível e a barra de progresso precisa desaparecer. Agora, o que também precisamos fazer é criar esse adaptador de mensagens. Então, aqui vamos adicionar ponto-e-vírgula para evitar erros. Vamos chamar esse método. Depois de todos esses cálculos com ID de sala de bate-papo e configurar sala de bate-papo será chamado quando abrirmos esta atividade. Ok, agora precisamos criar um adaptador de mensagens. Então vamos criar uma nova classe. Ele irá estender adaptador de ponto de vista reciclador irá criar interclasse de que será chamado detentor da mensagem. Ele se estende suporte vista foi gerar construtor. Aqui dentro. O tipo será o detentor da mensagem. E vamos implementar todos os metais. Queremos ter campos, mensagem ArrayList. Então queremos ter imagem do remetente. Queremos ter uma imagem de receptor, e queremos ter contexto. Então por que precisamos remetente e receptor imagem isso porque queremos ter direito, direito ao lado direito nossas imagens. Ao lado do balão, que manterá a mensagem. E a imagem da lixadeira estará no lado esquerdo da nossa tela. Então você vai ver como fazemos isso mais tarde. Agora vamos criar construtor. Com todos esses. Aqui queremos retornar o tamanho das mensagens. E agora precisamos criar o suporte da mensagem. Então vamos criar um novo layout. E dividiremos aqui o código dentro. Vamos colocar layout de restrição. Ele será malhado pai e a altura será Conteúdo de Embrulho. Id de que será layout CC porque é layout de restrição. Dentro dele onde você chamou 35 DP, feixe de
35 dias, porque queremos ter imagem arredondada do remetente e receptor. Então você vai ouvir essa visão de imagem. Id será pequeno. Imagem do perfil, tipo de escala será centrada no corte. E fonte. Podemos colocá-lo para ser por padrão este. Então vamos adicionar o Corner Radius 35. Vamos também adicionar margem horizontal. Agora abaixo vista do cartão, queremos adicionar TextView, que irá realmente conter o conteúdo da mensagem. Assim, será envoltório conteúdo com margem horizontal de nove DEP. O fundo será este. Podemos mudá-lo mais tarde. Vamos colocar algumas ferramentas texto só para ver como é real. Bem, é importante. Vamos colocar alguns textos aleatórios para ver o quão bem a mensagem parece. Agora você pode ver que nossa mensagem está indo para branco. E para corrigir isso, também
precisamos usar três libras de largura máxima. Desta vez antes usamos com altura máxima quando estávamos trabalhando em editar texto aqui. Então agora você vê que nossa mensagem pode ser mais ampla do que isso. Vamos adicionar um pouco de estofamento aqui. Vamos colocar essas roupas de cama. E queremos colocar a margem máxima. Para que possamos ter algum espaçamento entre suas mensagens. Também precisamos de identificação para a visão da cicatriz. Você verá mais tarde. Por quê? Se quer saber por que está assim? Por que não alterou nada? Bem, isso é porque no tempo de execução, queremos mover a imagem do perfil para a esquerda ou para a direita. E estes textos, dependendo se é se ele é enviado por nós ou pelo nosso colega de quarto. Então, se estamos enviando mensagem, queremos que a foto do perfil esteja aqui e a mensagem de texto esteja aqui. E se estamos recebendo mensagem, queremos perfil para estar aqui e mensagem de texto para estar ao lado dela. Então, vamos fazer tudo isso nestes suporte de visualização OnBind. Então, em primeiro lugar, vamos no layout de restrição definido detentor da mensagem. Vista de texto, que será mensagem, ImageView, que será imagem de perfil. Agora inicialize esses. Vamos ver qual foi a idéia disso? Nós não adicionamos. Então, digamos que o conteúdo da mensagem txt. Esta imagem é pequena imagem de perfil. E vamos em primeiro lugar. E aqui crie a nossa visão e devolva o novo suporte da mensagem. E isso você será um argumento. Agora é a parte interessante. No suporte de visão OnBind, primeiro
queremos receber uma mensagem. E essa mensagem será tirada deste ArrayList por posição e obter conteúdo. E aqui, precisamos manipular com restrições através do código Java. Então, como fazer isso? Precisamos usar o layout de restrição. E é titular ponto LL, ponto titular, cc. Tudo. Agora queremos ouvir o cheque. Se a mensagem é não obter posição. Não se esqueça do remetente. É igual ao ponto de autenticação do Firebase GetInstance dot obter o usuário atual que recebe e-mail. Isto significa que somos remetentes
desta mensagem e queremos restringir todas elas à direita. Então vamos ver como é feito. Queremos usar conjunto de restrições, que é igual a novo conjunto de restrições. Então precisamos
clonar restrições definir ponto clone restrição layout, que é, que é esta restrição, toda
esta linha, basicamente. Para que possamos ter informações sobre restrições neste momento. Em seguida, queremos
limpar restrições da vista do cartão. Então vamos verificar qual vista de cartão é essa. Queremos sair desta vista de guarda. Então precisamos usar esses ID na verdade, queremos limpar restrições entre essa exibição de cartão de perfil. Do lado esquerdo. Também queremos limpar o conteúdo da mensagem do lado esquerdo. E queremos
conectar a vista
do cartão do seu lado direito. 2d linearmente para o layout de restrição e restrição certo? Margem 0. Então, o que isso significa? Vamos deixar isso mais claro. Então, se você for aqui, isso significa basicamente que nós puxamos restrições daqui para lá. Então, em outras palavras, através deste código, nós fizemos isso. Então E tem escrito restrição, certo, para escrever fora pai. Assim, do lado direito da vista de cartão para o lado direito do layout de restrição com 0 margens. Em seguida, queremos restringir estes TextView para estes vista de cartão. E vamos fazer isso alterando isso para conteúdo da mensagem, certo? Para o lado direito da visualização do cartão de perfil. E agora, depois de tudo isso estar concluído, vamos basicamente ter isso. E é assim que vai parecer. Então vamos desfazer essas mudanças e precisamos dizer boatos. Restrições definir um ponto se aplicam ao layout de restrição. Senão. Agora isso significa que não somos remetentes da mensagem. Recebemos a mensagem. E nós queremos basicamente fazer coisas diferentes. Então vamos copiar tudo isso. Queremos fazer o oposto. Então aqui vamos limpar as restrições certas, aquelas que estão definidas aqui. Basicamente, estabelecemos restrições certas aqui. Então aqui, queremos definir restrições à esquerda em vez de à direita. Mas aqui queremos definir da esquerda para a direita, porque o que agora queremos alcançar é isto. Portanto, lado esquerdo deste texto para o lado direito da visualização do cartão. Agora precisamos colocar, precisamos inflar imagem usando glide. E aqui vamos inflar a imagem central. Erro vai, vai inflar. Esta imagem. Joga inteira. Titular também será esta imagem. E vamos permitir que os Ds em imagem de perfil de ponto titular. Vamos fazer a mesma coisa aqui,
mas em vez de imagem do remetente, queremos inflar imagem do receptor. Então é isso. Agora vamos voltar para a atividade da mensagem. E aqui dentro OnCreate método, queremos inicializar um adaptador de mensagem. Mas em primeiro lugar, vamos declará-lo aqui. Então, o que precisamos passar é Messages ArrayList. Precisamos colocar imagem Sander, que vamos obter de GetInt e ponto obter string extra. Vamos voltar para a atividade do amigo e imagem de colega de quarto. Basicamente, minhas imagens na verdade
imagem remetente e imagem do receptor é imagem de colega de quarto. Agora precisamos colocar o contexto. Vai ser. Atividade da mensagem. Isto. Agora temos erros porque precisamos separar isso
assim e certifique-se de que você colocá-lo que depois de inicializar mensagens, nós também queremos agora inflar imagem na barra de ferramentas aqui. Então vamos fazer isso assim. Então é a imagem de sua colega de quarto. Se não estou a confundir, detentor do
lugar será este. O erro será este. E vamos carregar estes na barra de ferramentas de imagem. Então, o que mais precisamos fazer é aqui, depois de obter mensagens com sucesso, precisamos notificar adaptador. Esse conjunto de dados foi alterado. Então agora vamos executar o aplicativo e ver o que está acontecendo. Vamos agora clicar em Alex, que é, a propósito, EUA. E por alguma razão não vemos imagens aqui. Então, vamos ouvir. Lx tem foto. E aqui temos erro de digitação e como porque e é por isso que não temos imagem apropriada aqui. Então vamos executar o aplicativo novamente. Então, vamos agora clicar em Alex. Você pode ver que temos imagem aqui. Está funcionando bem. Vamos colocar algum tipo de mensagem. Esquecemo-nos de SetOnClickListener nesta vista de imagem aqui. Então primeiro precisamos de ok estes, ok, então vamos definir OnClickListener nesta imagem enviada. E quando clicarmos nesta mensagem será enviada desta maneira. Portanto, o Firebase Database GetInstance obtém referência. Referência é a mensagem é
mais o ID da sala de bate-papo. Nós agora usamos ponto push porque queremos gerar aleatória, cadeia
aleatória como, como este aqui, como aqueles. E, em seguida, vamos definir o valor nessa cadeia aleatória. Nova mensagem, Firebase, ot, o GetInstance, obter usuário atual, obter e-mail. Agora precisamos colocar o e-mail do receptor. Esse e-mail do receptor é retirado da atividade de amigos. É um e-mail do colega de quarto. Então aqui estamos pegando isso aqui e simplesmente nos referimos assim. E o conteúdo da mensagem será retirado deste texto de edição. Então é isso. E depois de enviarmos a mensagem, queremos esvaziar nosso texto de edição para que possamos começar a digitar nova mensagem. Agora, a última coisa é que precisamos definir este adaptador para estes visão recicladora. E essa visão recicladora precisa ter gerenciador de layout. Agora execute o aplicativo e veja o que acontecerá. Então vamos agora começar a conversar com o Max. Vamos dizer “oi”. E aqui temos alguns problemas com a interface do usuário. Então vamos ver como isso deu errado. Vamos abrir o adaptador, e vamos verificar essas restrições aqui. Então aqui nós deveríamos dizer esquerda porque
queremos conectar esta mensagem para o lado esquerdo do cartão você. Então vamos executar o aplicativo mais uma vez. E agora aqui você pode ver que nós temos mensagens não chat ID é Alex Max e mensagem objeto é este aqui. Então agora quando corremos de novo, quando abrimos conversa com o Max, vemos esta mensagem. Podemos enviar até emojis. Você pode ver agora que temos outro problema. E isso é porque no titular da mensagem, esse pensamento deveria ter sido embrulhado conteúdo. Então vamos executar o App uma última vez. Assim, você pode ver como é complicado criar um aplicativo como este. Há muitas tentativas e erros. Mas no final, o mais importante é
entender por que fizemos algo da maneira que fizemos. Então agora podemos começar a enviar algumas outras mensagens. Está funcionando muito bem. Então vamos executar este aplicativo em mais um dispositivo para testar como ele se comporta patinação com outro usuário. Vamos registrar alguns usuários aqui. Vamos nos inscrever. Vamos começar a conversar com Alex. Aqui. Se atualizarmos usuários e conversa OpenGL, vemos que temos mensagem de Jill e podemos conversar. Está funcionando muito bem. Se você está se perguntando como fazer notificação. Se recebermos nova mensagem ou, basicamente, se o nosso aplicativo está fechado e enviamos mensagem, como deixar o usuário saber que há uma nova mensagem. Estamos usando notificações push nesse propósito e esse é o tópico. Para algumas outras palestras. Aprenderemos isso também. Mas, por enquanto, é um tópico um pouco avançado porque precisamos saber sobre notificações em geral, e precisamos saber sobre servidores e APIs. Eu acredito que você gostou de criar este aplicativo. Foi um pouco difícil com muitos erros. Mas se tiver dúvidas ou dúvidas, estou aqui para responder a todas as suas perguntas. Então é isso para mim. Vejo-te na próxima palestra.