50
Android + Firebase

Android Firebase

Embed Size (px)

Citation preview

Page 1: Android Firebase

Android +

Firebase

Page 2: Android Firebase

Bruno de Lima e Silva

google.com/+BrunoDeLimaS

Gamer Pós-graduado Parto Humanizado Crowdmobi TraktoCoding Dojo

Page 3: Android Firebase

# O que é Firebase?

● Banco de Dados Real-time● Autenticação● Desenvolvimento rápido● Foco no usuário● Bibliotecas para várias plataformas

Page 4: Android Firebase

# Como o Firebase funciona?

●Uma ávore JSON● Sem registros● Novo objeto = Novo campo em um JSON● Valores monitorados● Por que “monitorar” um valor?

Page 5: Android Firebase

# Intro Android

● Estrutura do projeto● Layout e Widgets● Java, Activity, Fragment● Resouces Qualifiers (orientation, locale, screenSize)

Page 6: Android Firebase

# What do we need

● Git● JDK● Android SDK● Android Studio● GenyMotion*

Time to hit “next” *Emulador do android

Page 7: Android Firebase

Firebase

Page 8: Android Firebase

## Biblioteca

● Com o gradle é muito simles● Adicione essa dependência

● Clique em Gradle Sync

dependencies { compile 'com.firebase:firebase-client-android:2.3.1'}

Page 9: Android Firebase

## Biblioteca

● Em alguns casos, adicione

android { packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE-FIREBASE.txt' exclude 'META-INF/NOTICE' }}

Page 10: Android Firebase

## Permissões

● Internet

Só isso mesmo

<uses-permission android:name="android.permission.INTERNET" />

Page 11: Android Firebase

## Inicialização

● O firebase precisa ser iniciado com um context● Iniciar na classe Application● Pode ser na activity, se você só tiver uma.● Deve acontecer antes de qualquer operação com o

firebase.

Page 12: Android Firebase

## Inicialização

Seu código deve ficar mais ou menos assim.

public class Application extends android.app.Application {

@Override public void onCreate() { super.onCreate(); Firebase.setAndroidContext(this); }}

Page 13: Android Firebase

# Salvando

● Existem várias formas● Cada uma com seu propósito● Cada operação precisa de uma referência

Firebase ref = new Firebase("sua-url-aqui");

Page 14: Android Firebase

## setValue()

● A Mais comum● Escreve ou sobrescreve um valor

Firebase userRef = ref.child("users").child("gdgmaceio");userRef.child("name").setValue("GDG Maceió");userRef.child("birthYear").setValue(2014);

Page 15: Android Firebase

## setValue()

O código anterior criou a seguinte estrutura.

Page 16: Android Firebase

## setValue()

Podemos passar um objeto.

public class User { private int birthYear; private String name; ...}

Firebase userRef = ref.child("users").child("gdgmaceio");User user = new User("GDG Maceió", 2014);userRef.setValue(user);

Page 17: Android Firebase

## setValue()

O código anterior também pode ser substituído por um map.

Firebase userRef = ref.child("users").child("gdgmaceio");Map<String, String> userMap = new HashMap<String, String>();userMap.put("birthYear", "2014");userMap.put("name", "GDG Maceió");userRef.setValue(userMap);

Page 18: Android Firebase

## updateChildren()

● Atualiza apenas os nós alterados● Usar pra editar múltiplos campos de simultaneamente

Firebase userRef = ref.child("users").child("gdgmaceio");Map<String, Object> userMap = new HashMap<String, Object>();nickname.put("name", "GDG Maceió Rocks!");userMap.put("birthYear", "2013");userRef.updateChildren(userMap);

Page 19: Android Firebase

## push()

● Usado para Listas● Gerador de Identificador Único

Firebase chats = ref.child("chats");

Map<String, String> post1 = new HashMap<String, String>();post1.put("author", "brunodles");post1.put("message", "Android Is Awesome");chats.push().setValue(post1);

Page 20: Android Firebase

## push()

● Para adicionar o um segundo post

Map<String, String> post2 = new HashMap<String, String>();post2.put("author", "gdgmaceio");post2.put("message", "Firebase too! \\o/");chats.push().setValue(post2);

Page 21: Android Firebase

## runTransaction()

● Quando usar○Operações concorrentes○Possibilidade de inconsistência de dados

● Implementação diferente

Page 22: Android Firebase

## runTransaction()ref.child("chatCount").runTransaction(new Transaction.Handler() { @Override public Transaction.Result doTransaction(MutableData currentData) { if (currentData.getValue() == null) { currentData.setValue(1); } else { currentData.setValue((Long) currentData.getValue() + 1); }

return Transaction.success(currentData); //we can also abort by calling Transaction.abort() }

@Override public void onComplete(FirebaseError firebaseError, boolean committed, DataSnapshot currentData) { //This method will be called once with the results of the transaction. }});

Page 23: Android Firebase

# Monitorando Dados

● Implementar Interface● Observer● Várias formas de observar

Page 24: Android Firebase

## Eventos

Os eventos são disparados de acordo com alguma ação dentro da referência atual.● Adicionar● Alterar● Remover

Page 25: Android Firebase

### Value

● Monitora todas alterações● Primeira chama é o estado atual● Chamadas seguintes são atualizações● Sempre retorna estrutura interna completa

ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { }

@Override public void onCancelled(FirebaseError firebaseError) { }});

Page 26: Android Firebase

#### Child Added

● Monitora os filhos● Usado para listas● Chamado uma vez para cada filho

ref.addChildEventListener(new ChildEventListener() {

@Override public void onChildAdded(DataSnapshot snapshot, String previousChildKey) { }

});

Page 27: Android Firebase

#### Child Changed

● Monitora alteração dos Filhos● Usado em conjunto com childAdded● Chamado para alteração dos filhos ou descendentes

ref.addChildEventListener(new ChildEventListener() {

@Override public void onChildChanged(DataSnapshot snapshot, String previousChildKey) { }

});

Page 28: Android Firebase

#### Child Removed

● Monitora remoção dos Filhos● Usado em conjunto com childAdded e childChanged● Recebe uma cópia do filho que foi removido

ref.addChildEventListener(new ChildEventListener() {

@Override public void onChildRemoved(DataSnapshot snapshot) { }

});

Page 29: Android Firebase

## Queries

● Ordenação● Limites

Query query = ref.child("chats").orderByChild("date");

Page 30: Android Firebase

Firedroid

https://github.com/brunodles/Firedroid-gdg

Page 31: Android Firebase

1_ Criar projeto

Page 32: Android Firebase

1_ Criar projeto

Page 33: Android Firebase

1_ Criar projeto

Page 34: Android Firebase

1_ Criar projeto

Page 35: Android Firebase

1_ Criar projeto

Page 36: Android Firebase

2_ Importe o Firebase

dependencies { compile 'com.firebase:firebase-client-android:2.3.1'}

packagingOptions { exclude 'META-INF/LICENSE' exclude 'META-INF/LICENSE-FIREBASE.txt' exclude 'META-INF/NOTICE'}

● Importe usando o gradle

● Adicione para evitar possíveis conflitos

Page 37: Android Firebase

3_ Permissão de Internet

● Adicione no AndroidManifest.xml

<uses-permission android:name="android.permission.INTERNET" />

Page 38: Android Firebase

4_ Inicialize o Firebase

● Crie uma nova classe java chamada Application● Faça ela herdar de android.app.Application● Sobrescreva o método onCreate● Inicialize o Firebase● Use essa classe como name da tag Application no

AndroidManifest.xml

Page 39: Android Firebase

4_ Inicialize o Firebasepublic class Application extends android.app.Application { @Override public void onCreate() { super.onCreate(); Firebase.setAndroidContext(this); }}

<application android:name=".Application"

Page 40: Android Firebase

5_ Classe auxiliar

● Essa classe vai ajudar a acessar o Firebase● Pode evoluir pra um Data Access Object

public class FirebaseHelper {

public static Firebase get() { return new Firebase("https://firedroid.firebaseio.com/"); }}É possível colocar essa string em outros arquivos, deixando a compilação mais dinâmica.

Page 41: Android Firebase

6_ Login

● Adicionar ao layout○ Campos de texto

■Email■Password

○ Botões■Sign In

■ Sign UP■ Forgot password

Page 42: Android Firebase

6_ Login

● Associar os campos no fragment● Criar

○Click Listener para os botões○registro de usuário○login de usuário○recuperar senha

● remover menu

Existe uma lib para fazer essas associações de forma mais elegante.

Page 43: Android Firebase

7_ Chat

● Montar tela do chat○ TextView○EditText○Button

● Associar widgets● Iniciar após o Login● Enviar mensagem

Page 44: Android Firebase

7_ Chat

Firebase firebase = FirebaseHelper.get();Firebase messageRef = firebase.child("messages").push();messageRef.child("text").setValue(message.getText().toString());

Page 45: Android Firebase

7_ Chat

● Exibir todas as mensagems no TextView● Usando o Value Event Listener

Depois vamos mudar isso, para um ListView

Iterable<DataSnapshot> children = dataSnapshot.getChildren();StringBuilder builder = new StringBuilder();for (DataSnapshot child : children) { builder.append(child.child("text").getValue()); builder.append("\n");}messages.setText(builder.toString());

Page 46: Android Firebase

8_ Melhorar Login

● Travar tela (Progress dialog)● Logar usuário depois de registrar● Guardar dados de login

Page 47: Android Firebase

9_ Melhorar Chat

● Enviar mensagem direto do teclado● Limpar texto atual● Colocar ListView no Layout● Layout dos itens● Adapter● Mover para última messagem

Page 48: Android Firebase

10_ Melhorar Código

● Organizar classes● Criar Classe Mensagem● Helper para referencia de mensagem● Enviar mensagem usando helper● Extrair Login Preference

Page 49: Android Firebase

11_ Libs

● ButterKnife¹● SnackBar (DesignCompat)²

¹ Remover “findViewById” e “Click Listeners”

compile 'com.jakewharton:butterknife:7.0.1'compile 'com.android.support:design:22.2.1'

² Substituir Toast

Page 50: Android Firebase

Obrigado

+BrunoDeLimaS

Bruno de Lima

@brunodles