Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android Training Program - Portugal, Aula 7

9e9eb825c69d719f2d3c32bdd3bc971e?s=47 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

9e9eb825c69d719f2d3c32bdd3bc971e?s=128

ATP Portugal

December 02, 2020
Tweet

Transcript

  1. Android Training Program PORTUGAL Aula #7 Firebase

  2. • 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
  3. Andres-Leonardo Martinez-Ortiz Google Carlos Mota Formador Renato Almeida Formador @davilagrau

    @cafonsomota @tallnato Equipa Daniela Ferreira Gestora de comunidades
  4. • 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
  5. #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 ✅ ✅ ✅
  6. 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
  7. http://events.withgoogle.com/atp2020 ✉ atp-suporte@googlegroups.com http://bit.ly/atp2020-youtube http://bit.ly/atp2020-discord Links

  8. http://bit.ly/atp2020-live

  9. http://bit.ly/atp2020-codelabs

  10. http://bit.ly/kahoot-aula7

  11. Resumo da Aula #6

  12. 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
  13. CameraX β Sistema de add-ons Consistência em todos os diapositivos

    Funciona com 94% dos Android 5.0+
  14. CameraX β Captura Análise de imagem Pré-visualização Casos de uso

    https://developer.android.com/training/camerax
  15. 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 α
  16. Aula #7

  17. Firebase

  18. “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?
  19. Compatível com

  20. • 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
  21. • 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
  22. • 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
  23. 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
  24. 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
  25. 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
  26. buildscript { dependencies { classpath 'com.google.gms:google-services:4.3.4' } } Como utilizar?

    Importar a biblioteca build.gradle
  27. 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
  28. 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
  29. Vamos criar um projeto ‍‍

  30. Firebase Authentication

  31. None
  32. 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
  33. FirebaseUI Authentication Diferentes formas de te autenticares

  34. 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
  35. buildscript { ... dependencies { classpath 'com.android.tools.build:gradle:4.2.0-alpha16' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath

    'com.google.gms:google-services:4.3.4' } } Como utilizar? Importar a biblioteca build.gradle
  36. 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
  37. dependencies { implementation platform('com.google.firebase:firebase-bom:26.1.0') implementation 'com.google.firebase:firebase-auth-ktx' implementation 'com.firebaseui:firebase-ui-auth:6.4.0' } Como

    utilizar? Importar a biblioteca app/build.gradle
  38. <com.google.android.gms.common.SignInButton android:id="@+id/sign_in" android:layout_width="wrap_content" android:layout_height="wrap_content"/> Como utilizar? Definir o botão de

    ação activity_login.xml
  39. findViewById<SignInButton>(R.id.sign_in).setOnClickListener { val providers = arrayListOf(AuthUI.IdpConfig.GoogleBuilder().build()) startActivityForResult( AuthUI.getInstance() .createSignInIntentBuilder() .setAvailableProviders(providers)

    .build(), REQUEST_SIGN_IN) } Como utilizar? Definir o botão de ação LoginActivity.kt
  40. 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
  41. Firebase Realtime database

  42. None
  43. 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
  44. • 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
  45. • 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
  46. • 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
  47. Cloud Firestore

  48. None
  49. 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
  50. • 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
  51. • 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
  52. dependencies { implementation platform('com.google.firebase:firebase-bom:26.1.0') implementation 'com.google.firebase:firebase-firestore-ktx' } Como utilizar? Importar

    a biblioteca app/build.gradle
  53. 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
  54. 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
  55. 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
  56. 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
  57. 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
  58. 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
  59. 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
  60. 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
  61. VS

  62. https://firebase.google.com/docs/database/rtdb-vs-firestore

  63. 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
  64. Rosário Pereira Fernandes Firebase KTX: Porquê, O quê e Como?

    GDG Maputo GDE Firebase @_rpfernandes
  65. Abre o Android Studio e vamos começar a programar ‍‍

  66. VS Ronda 6

  67. 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);
  68. fun makeDog( name String, legs Int, color String, ) Vírgula

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

    nos parâmetros void makeDog( String name, int legs, String color )
  70. Natal Photo by Mel Poole Unsplash

  71. Regiões Permite criar zonas de código, demarcadas por comentários. //

    region <name> ... // endregion
  72. Regiões Permite criar zonas de código, demarcadas por comentários. //

    region <name> ... // endregion
  73. 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
  74. 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
  75. Trabalho Para Casa ‍‍

  76. ⚠ Não há trabalho de casa que amanhã há aula!

  77. None
  78. Dúvidas?

  79. Continuamos a responder no discord

  80. Obrigado ‍♀

  81. Android Training Program PORTUGAL Aula #8 Firebase Próxima aula: 03

    de Dezembro