$30 off During Our Annual Pro Sale. View Details »

Android Training Program - Portugal, Aula 7

ATP Portugal
December 02, 2020

Android Training Program - Portugal, Aula 7

Aula #7 Firebase 🔥

E se tu conseguires criar uma aplicação do zero, com autenticação por redes sociais, base de dados online e até alojamento web, apenas por incluíres algumas bibliotecas?

- Introdução às funcionalidades do Firebase
- Autenticação com Google
- Realtime Database
- Cloud Firestore

ATP Portugal

December 02, 2020
Tweet

More Decks by ATP Portugal

Other Decks in Education

Transcript

  1. • Sejam excelentes uns para os outros • Fale mais

    alto se vir ou ouvir alguma coisa • O assédio não é tolerado • Pratique "Sim e" um ao outro Código de conduta Mais informações: http://bit.ly/2IhF0l3
  2. Andres-Leonardo Martinez-Ortiz Google Carlos Mota Formador Renato Almeida Formador @davilagrau

    @cafonsomota @tallnato Equipa Daniela Ferreira Gestora de comunidades
  3. • 12 aulas • 1h30 cada aula • ~1 aula

    por semana • 14 Outubro a 16 Dezembro • YouTube live • Suporte assíncrono contínuo via Discord/email • Todo o código disponível no GitHub Photo by Arif Riyanto on Unspla O programa
  4. #0 14 de Outubro Pronto para começar #1 21 de

    Outubro Bem-vindos ao Android #2 28 de Outubro Fundações I #3 04 de Novembro Fundações II #4 11 de Novembro Fundações III #5 18 de Novembro Listas, listas e mais listas #6 25 de Novembro Jetpack, Jetpack, Jetpack! #7 - #8 02 - 03 de Dezembro Firebase #9 - #10 09 - 10 de Dezembro MLKit & TensorFlow #11 16 de Dezembro Resumo Semana Semana Calendário ✅ ✅ ✅ ✅ Direto ✅ ✅ ✅
  5. Sumário Photo by Mika Baumeister on Unsplash • Resumo da

    aula anterior • Introdução ao Firebase • Autenticação • Firestore • Realtime Database • Kotlin para principiantes • É Natal
  6. Como utilizar? Importar a biblioteca Room Resto da aplicação Data

    Access Object Entidades Obter os DAOs Obter as entidades da BD Persistir os dados para a BD get / set valores
  7. CameraX β Captura Análise de imagem Pré-visualização Casos de uso

    https://developer.android.com/training/camerax
  8. Compose • Forma inovadora de criar layouts nativos (em Android)

    • Permite construir componentes gráficos de forma declarativa • Interoperável com os componentes nativos • Reduz a quantidade de código necessário para criar interfaces gráficas • Tira partido das vantagens de Kotlin para facilitar a escrita de código α
  9. “O Firebase é uma plataforma móvel (Android, iOS e web)

    da Google que ajuda a desenvolver aplicações de grande qualidade rapidamente e permite crescer os negócios.“ O que é o Firebase?
  10. • Criar rapidamente aplicações, sem gerir uma infraestrutura ◦ O

    Firebase oferece funcionalidades como analytics, bases de dados, mensagens e relatórios de falhas, que permitem agir rapidamente e concentrar nos utilizadores Firebase
  11. • Apoiado pela Google, confiado pelas aplicações de topo ◦

    O Firebase é construído sobre a infraestrutura da Google e escala automaticamente, mesmo para aplicações grandes. Firebase
  12. • Uma plataforma, com produtos que funcionam melhor juntos ◦

    Os produtos do Firebase funcionam individualmente, mas partilham dados e ‘insights’, de modo a que funcionem ainda melhor quando juntos. Firebase
  13. Constrói melhores aplicações Cloud Firestore Armazena e sincroniza dados a

    uma escala global Firebase ML Machine learning para programadores Cloud Functions Corre código de servidor sem gerir servidores Authentication Autentica utilizadores de forma simples e segura Hosting Distribui recursos web rapidamente e com segurança Cloud Storage Armazena e distribui ficheiros à escala da Google Realtime Database Armazena e sincroniza dados da aplicação em segundos
  14. Melhora a qualidade da aplicação Crashlytics Prioritiza e resolve problemas

    com relatórios poderosos e em tempo real Performance Monitoring Obtém informações sobre o desempenho da aplicação Test Lab Testa a tua aplicação em dispositivos alojados pela Google App Distribution Distribuí versões de pré-lançamento da aplicação a utilizadores específicos
  15. Cresce o teu negócio In-App Messaging Envolve os utilizadores activos

    com mensagens contextuais Google Analytics Obtém métricas gratuitas e ilimitadas Predictions Segmentação inteligente de utilizadores baseada no comportamento previsto A/B Testing Optimiza a experiência da aplicação através de experimentação Cloud Messaging Envia mensagens e notificações direcionadas Remote Config Modifica a tua aplicação sem lançar uma nova versão Dynamic Links Impulsiona o crescimento utilizado links directos
  16. apply plugin: 'com.android.application' apply plugin: 'com.google.gms.google-services' // ou plugins {

    id 'com.android.application' id 'kotlin-android' id 'com.google.gms.google-services' } Como utilizar? Importar a biblioteca app/build.gradle
  17. dependencies { implementation platform('com.google.firebase:firebase-bom:26.1.0') // Por utilizarmos o Bill of

    Materials (BoM) , não precisamos de declarar as versões das outras bibliotecas implementation 'com.google.firebase:firebase-analytics-ktx' } Como utilizar? Importar a biblioteca app/build.gradle
  18. FirebaseUI Authentication • Suporta: ◦ E-mail e palavra-chave ◦ Integração

    com Google, Apple, Facebook, Twitter e GitHub ◦ Autenticação via o número de telemóvel (SMS) ◦ Integração com sistemas de autenticação externos ◦ Autenticação anónima Diferentes formas de te autenticares
  19. plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-kapt' id 'com.google.gms.google-services'

    } dependencies { implementation platform('com.google.firebase:firebase-bom:26.1.0') implementation 'com.google.firebase:firebase-auth-ktx' } Como utilizar? Importar a biblioteca app/build.gradle
  20. FirebaseUI Authentication • Solução completa de UI ◦ É a

    forma recomendada para implementares o teu ecrã de login • Não precisas de te preocupar com nada ◦ Todos os fluxos de autenticação já se encontram implementados ◦ Só precisas de implementar a ação de clique no botão
  21. override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode,

    resultCode, data) if (requestCode == REQUEST_SIGN_IN) { val response = IdpResponse.fromResultIntent(data) if (resultCode == Activity.RESULT_OK) { val intent = Intent(this, MainActivity::class.java) intent.putExtra(EXTRA_USERNAME, FirebaseAuth.getInstance().currentUser) startActivity(intent) finish() } } } Como utilizar? Verificar se o utilizador foi autenticado com sucesso
  22. Guarda e sincroniza os teus dados na nuvem através de

    uma base de dados NOSQL. A informação é sincronizada em tempo-real entre todos os clientes que se encontrem ligados e é mantida localmente, mesmo quando não tens acesso à rede. Firebase Realtime database
  23. • Atualizações em tempo real ◦ Em cada actualização da

    base de dados, todos os clientes que se encontrem online são notificados num espaço de milisegundos Firebase Realtime database
  24. • Suporte offline ◦ Os dados são guardados localmente até

    o telemóvel se ligar novamente à rede. • Acessível a partir de qualquer dispositivo • Escalável ◦ Desenhado para ter a capacidade de processar todos os dados de uma aplicação, por mais pesados que possam ser. Firebase Realtime database
  25. • Suporte offline ◦ Os dados são guardados localmente até

    o telemóvel se ligar novamente à rede. • Acessível a partir de qualquer dispositivo • Escalável ◦ Desenhado para ter a capacidade de processar todos os dados de uma aplicação, por mais pesados que possam ser. Firebase Realtime database Vamos chamar de versão 1.0
  26. Cloud Firestore • Atualizações em tempo real ◦ Em cada

    actualização da base de dados, todos os clientes que se encontrem online são notificados num espaço de milisegundos
  27. • Suporte offline ◦ Os dados são guardados localmente até

    o telemóvel se ligar novamente à rede. • Acessível a partir de qualquer dispositivo • Escalável ◦ Desenhado para ter a capacidade de processar todos os dados de uma aplicação, por mais pesados que possam ser. Cloud Firestore
  28. • Flexível ◦ O modelo de dados suporta estruturas de

    dados hierárquicas. Podes guardar os teus dados em documentos (documents) e organizá-los por colecções (collections). • Pesquisas complexas ◦ As pesquisas são indexadas por predefinição. Podes carregar todo o conteúdo da base de dados ou filtrar por conteúdo específico. Cloud Firestore
  29. private fun sendMessage(content: String) { val message = hashMapOf( "username"

    to deviceName(), "content" to content, "timestamp" to "${System.currentTimeMillis()}" ) val db = Firebase.firestore val id: String = db.collection("collection_name").document().id db.collection("atp").document(id) .set(message) .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully written!") } .addOnFailureListener { e -> Log.w(TAG, "Error writing document. Error:$e") } } Como utilizar? Enviar dados ChatFragment.kt
  30. private fun sendMessage(content: String) { val message = hashMapOf( "username"

    to deviceName(), "content" to content, "timestamp" to "${System.currentTimeMillis()}" ) val db = Firebase.firestore val id: String = db.collection("collection_name").document().id db.collection("atp").document(id) .set(message) .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully written!") } .addOnFailureListener { e -> Log.w(TAG, "Error writing document. Error:$e") } } Como utilizar? Enviar dados ChatFragment.kt
  31. private fun sendMessage(content: String) { val message = hashMapOf( "username"

    to deviceName(), "content" to content, "timestamp" to "${System.currentTimeMillis()}" ) val db = Firebase.firestore val id: String = db.collection("collection_name").document().id db.collection("atp").document(id) .set(message) .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully written!") } .addOnFailureListener { e -> Log.w(TAG, "Error writing document. Error:$e") } } Como utilizar? Enviar dados ChatFragment.kt
  32. private fun sendMessage(content: String) { val message = hashMapOf( "username"

    to deviceName(), "content" to content, "timestamp" to "${System.currentTimeMillis()}" ) val db = Firebase.firestore val id: String = db.collection("collection_name").document().id db.collection("atp").document(id) .set(message) .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully written!") } .addOnFailureListener { e -> Log.w(TAG, "Error writing document. Error:$e") } } Como utilizar? Enviar dados ChatFragment.kt
  33. private fun loadMessages() { val docs = Firebase.firestore.collection("atp").orderBy("timestamp") docs.addSnapshotListener {

    snapshot, e -> val messages = Message.toMessageList(snapshot.documents) adapter.submitList(messages) } } Como utilizar? Receber uma lista de dados ChatFragment.kt
  34. private fun loadMessages() { val docs = Firebase.firestore.collection("atp").orderBy("timestamp") docs.addSnapshotListener {

    snapshot, e -> val messages = Message.toMessageList(snapshot.documents) adapter.submitList(messages) } } Como utilizar? Receber uma lista de dados ChatFragment.kt
  35. private fun loadMessages() { val docs = Firebase.firestore.collection("atp").orderBy("timestamp") docs.addSnapshotListener {

    snapshot, e -> val messages = Message.toMessageList(snapshot.documents) adapter.submitList(messages) } } Como utilizar? Receber uma lista de dados ChatFragment.kt
  36. private fun loadMessages() { val docs = Firebase.firestore.collection("atp").orderBy("timestamp") docs.addSnapshotListener {

    snapshot, e -> val messages = Message.toMessageList(snapshot.documents) adapter.submitList(messages) } } Como utilizar? Receber uma lista de dados ChatFragment.kt
  37. VS

  38. Realtime database Cloud Firestore Atualizações em tempo real ✅ ✅

    Suporte offline ✅ ✅ Presença ✅ ❌ Modelo de dados JSON Collections Pesquisa Limitada Permite filtros mais avançados Performance Regional Mundial Escalabilidade <200.000 ligações simultâneas Automática
  39. val elapsed = measureTimeMillis { myCall() println("Measuring time via measureTimeMillis")

    } println(elapsed) Medir tempo de execução long startTime = System.currentTimeMillis(); myCall(); long stopTime = System.currentTimeMillis(); System.out.println(stopTime - startTime);
  40. fun makeDog( name String, legs Int, color String, ) Vírgula

    nos parâmetros void makeDog( String name, int legs, String color )
  41. fun makeDog( name String, legs Int, color String, ) Vírgula

    nos parâmetros void makeDog( String name, int legs, String color )
  42. editorconfig.org • Este ficheiro ajuda a manter consistência de estilos

    no código, para programadores a trabalhar no mesmo projeto em vários editores e IDE’s. • Deve ser colocado na raiz do projeto • Permite criar regras gerais ao projeto, ou específicas para um tipo de ficheiros
  43. editorconfig.org Exemplo # indicate this is the root of the

    project root = true [*] charset = utf-8 indent_style = space indent_size = 4 trim_trailing_whitespace = true insert_final_newline = true end_of_line = lf max_line_length = 140 [*.{xml}] max_line_length = 100 .editorconfig