Slide 1

Slide 1 text

Android Training Program PORTUGAL Aula #7 Firebase

Slide 2

Slide 2 text

● 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

Slide 3

Slide 3 text

Andres-Leonardo Martinez-Ortiz Google Carlos Mota Formador Renato Almeida Formador @davilagrau @cafonsomota @tallnato Equipa Daniela Ferreira Gestora de comunidades

Slide 4

Slide 4 text

● 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

Slide 5

Slide 5 text

#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 ✅ ✅ ✅

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

http://events.withgoogle.com/atp2020 ✉ [email protected] http://bit.ly/atp2020-youtube http://bit.ly/atp2020-discord Links

Slide 8

Slide 8 text

http://bit.ly/atp2020-live

Slide 9

Slide 9 text

http://bit.ly/atp2020-codelabs

Slide 10

Slide 10 text

http://bit.ly/kahoot-aula7

Slide 11

Slide 11 text

Resumo da Aula #6

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

CameraX β Sistema de add-ons Consistência em todos os diapositivos Funciona com 94% dos Android 5.0+

Slide 14

Slide 14 text

CameraX β Captura Análise de imagem Pré-visualização Casos de uso https://developer.android.com/training/camerax

Slide 15

Slide 15 text

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 α

Slide 16

Slide 16 text

Aula #7

Slide 17

Slide 17 text

Firebase

Slide 18

Slide 18 text

“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?

Slide 19

Slide 19 text

Compatível com

Slide 20

Slide 20 text

● 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

Slide 21

Slide 21 text

● 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

Slide 22

Slide 22 text

● 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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

buildscript { dependencies { classpath 'com.google.gms:google-services:4.3.4' } } Como utilizar? Importar a biblioteca build.gradle

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Vamos criar um projeto ‍‍

Slide 30

Slide 30 text

Firebase Authentication

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

FirebaseUI Authentication Diferentes formas de te autenticares

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

Como utilizar? Definir o botão de ação activity_login.xml

Slide 39

Slide 39 text

findViewById(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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

Firebase Realtime database

Slide 42

Slide 42 text

No content

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

● 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

Slide 45

Slide 45 text

● 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

Slide 46

Slide 46 text

● 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

Slide 47

Slide 47 text

Cloud Firestore

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

● 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

Slide 51

Slide 51 text

● 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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

VS

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

Rosário Pereira Fernandes Firebase KTX: Porquê, O quê e Como? GDG Maputo GDE Firebase @_rpfernandes

Slide 65

Slide 65 text

Abre o Android Studio e vamos começar a programar ‍‍

Slide 66

Slide 66 text

VS Ronda 6

Slide 67

Slide 67 text

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);

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

Natal Photo by Mel Poole Unsplash

Slide 71

Slide 71 text

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

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

Trabalho Para Casa ‍‍

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

Dúvidas?

Slide 79

Slide 79 text

Continuamos a responder no discord

Slide 80

Slide 80 text

Obrigado ‍♀

Slide 81

Slide 81 text

Android Training Program PORTUGAL Aula #8 Firebase Próxima aula: 03 de Dezembro