Slide 1

Slide 1 text

Android Training Program PORTUGAL Aula #9 ML Kit: Machine Learning para iniciantes

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 Machine Learning ● ML Kit ● 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-aula9

Slide 11

Slide 11 text

Resumo da Aula #8

Slide 12

Slide 12 text

● O Cloud storage é um serviço de armazenamento poderoso, simples e barato desenvolvido para a escala da Google ● Os SDK’s disponíveis adicionam a segurança da Google para as transferências dos ficheiros ● É possível armazenar imagens, áudios, vídeos ou outros tipos de conteúdos Cloud Storage

Slide 13

Slide 13 text

● Relatórios de falhas completos e em tempo real ● Permite encontrar rapidamente a causa das falhas ● As falhas são priorizadas de forma a permitir identificar o que corrigir primeiro ● Alertas em tempo real Crashlytics

Slide 14

Slide 14 text

● Mede automaticamente o tempo de arranque da aplicação, pedidos HTTP à rede, entre outros ● Permite observar situações em que a aplicação possa ser mais rápida ● Permite customizar os parâmetros a monitorizar da aplicação Performance

Slide 15

Slide 15 text

● Enviar notificações ou mensagens com dados ● Permite direcionar as notificações para diferentes utilizadores de forma versátil ● Permite enviar mensagens através dos clientes Push Notifications

Slide 16

Slide 16 text

● Camada sobre Google Analytics ● Solução de analytics grátis e ilimitada ● Permite reportar até 500 eventos distintos ● Os relatórios ajudam a perceber o como os utilizadores se comportam, o que permite tomar decisões informadas sobre marketing e otimizações de performance Analytics

Slide 17

Slide 17 text

Aula #9

Slide 18

Slide 18 text

Luiz Gustavo @gusthema TensorFlow Developer Advocate Google O que é Machine Learning?

Slide 19

Slide 19 text

Machine Learning

Slide 20

Slide 20 text

No content

Slide 21

Slide 21 text

Machine learning Algoritmos Deep learning Inteligência artificial ...

Slide 22

Slide 22 text

● Pode ser visto como uma forma de ajudar o software a realizar uma tarefa sem programar explicitamente ou criar regras ● Na programação tradicional, um programador especifica as regras que o computador deve usar ● Focado mais em análise de dados do que em programação ● São disponibilizados um conjunto de exemplos e o computador aprende a partir destes dados ● Podemos ver o machine learning como “programar com dados” Machine learning

Slide 23

Slide 23 text

Photo by Eugene Chystiakovl

Slide 24

Slide 24 text

Photo by Eugene Chystiakovl ● IBM Deep Blue vence o campeão do mundo de Xadrez Garry Kasparov ● Uma base de dados com mais de 700 mil partidas de Xadrez ● Que combina com o jogo atual de forma a escolher a melhor jogada ● O mesmo jogo tem sempre o mesmo resultado ● Não existe o conceito de machine learning presente ○ Mas sim o de uma inteligência artificial no seu início

Slide 25

Slide 25 text

theverge.com/2019/10/30/20939147/deepmind-google-alphastar-starcraft-2-research-grandmaster-level

Slide 26

Slide 26 text

● Extrapolar dados ● Evitar fraudes ● Identificar oportunidades de investimento ● Auxiliar os investidores a decidir quando negociar ● Identificar clientes com perfis de alto risco Banca e finanças Onde é aplicado? Photo by Micheile Henderson https://www.sas.com/en_us/insights/analytics/machine-learning.html

Slide 27

Slide 27 text

● Analisam várias fontes de dados, de forma a aumentar a eficiência e economizar dinheiro ● Ajuda na detecção de fraudes e minimizar o roubo de identidade Governos Onde é aplicado? Photo by Marco Oriolesi https://www.sas.com/en_us/insights/analytics/machine-learning.html

Slide 28

Slide 28 text

● Através da análise dos dados de wearables e outros tipos de sensores, permite avaliar o paciente em tempo real ● Identificar tendências ou sinais de alerta de forma a melhorar os diagnósticos e tratamentos ● Serve de complemento para os diagnósticos médicos Saúde Onde é aplicado? Photo by Online Marketing

Slide 29

Slide 29 text

https://about.google/intl/ALL_us/stories/seeingpotential/

Slide 30

Slide 30 text

● Recomendação de produtos que o cliente poderá gostar, com base em compras anteriores ● Analisa a interação do utilizador e melhora a experiência de compra ○ Campanhas publicitárias dirigidas ● Otimização de preços ● Gestão de mercadorias Retalho Onde é aplicado? Photo by Eduardo Soares https://www.sas.com/en_us/insights/analytics/machine-learning.html

Slide 31

Slide 31 text

Navegação com uma conta registada

Slide 32

Slide 32 text

Navegação em modo anónimo

Slide 33

Slide 33 text

● Identificar padrões e tendências ● Tornar os percursos mais eficientes ○ Caminhos alternativos ao trânsito ● Prever potenciais problemas Transporte Onde é aplicado? Photo by frank mckenna https://www.sas.com/en_us/insights/analytics/machine-learning.html

Slide 34

Slide 34 text

● Reduzir a pegada ecológica ● Prever alterações climatéricas ● Agricultura mais sustentável, identificando: ○ Áreas que precisem de ser regadas ○ Qual vai ser o escoamento da produção ○ Possíveis pestes que possam surgir ● O mundo à nossa volta Onde é aplicado? Photo by Gustavo Quepón

Slide 35

Slide 35 text

https://about.google/intl/ALL_us/stories/save-the-bees/

Slide 36

Slide 36 text

● Sistemas de recomendação como os da Netflix, YouTube ou Spotify ● Motores de busca como Google ● Toda a informação que te faz fazer scroll continuamente nas redes sociais ● Assistentes de voz como o Assistente da Google, Siri ou Alexa Exemplos do dia a dia

Slide 37

Slide 37 text

● Cada plataforma guarda o maior número de dados sobre as ações dos utilizadores ○ que imagens fizeram "gosto" ○ que páginas visitaram ○ quanto tempo estiveram a explorar ● Com toda esta informação, e um complexo mecanismo de machine learning, vamos cada vez recebendo mais informações dirigidas aos nossos gostos Exemplos do dia a dia

Slide 38

Slide 38 text

ML Kit

Slide 39

Slide 39 text

● O ML Kit leva a experiência em machine learning até aos dispositivos móveis ● É uma biblioteca poderosa e fácil de utilizar ● Permite que as aplicações Android/iOS ○ Sejam personalizadas com base nas interações dos utilizadores ○ Ao mesmo tempo, está otimizada para correr nestes dispositivos ● Totalmente gratuito Machine learning para dispositivos móveis

Slide 40

Slide 40 text

● O processamento do ML Kit é feito no dispositivo, tornando-o mais rápido ● Permite casos de uso de processamento em tempo real, tais como processamento de imagens/vídeo da câmera ● Também funciona offline e pode ser utilizado para processar imagens e texto que necessitem de permanecer no dispositivo Otimizado para dispositivos móveis

Slide 41

Slide 41 text

● Permite aproveitar as vantagens das tecnologias de machine learning que potencializam as próprias experiências e aplicações em dispositivos móveis da Google Desenvolvido com a experiência da Google

Slide 42

Slide 42 text

● O ML Kit combina os melhores modelos de machine learning com canais de processamento bastante avançados e oferece isto através de APIs fáceis de utilizar, que permitem casos de uso bastante poderosos para aplicações móveis Fácil de utilizar

Slide 43

Slide 43 text

Visão Linguagem natural

Slide 44

Slide 44 text

● Identificar e processar códigos de barras ● Suporta a maioria dos formatos de 1D e 2D disponíveis Detectar códigos de barras Visão

Slide 45

Slide 45 text

Detectar códigos de barras Funcionalidade Não integrado na app Integrado na app Implementação O modelo é carregado dinamicamente do Google Play Services O modelo é integrado na aplicação em tempo de compilação Tamanho do APK Sem impacto ≈ 2.2MB Tempo de inicialização Poderá ser necessário esperar que o modelo seja transferido antes do primeiro uso O modelo está disponível imediatamente

Slide 46

Slide 46 text

dependencies { // Modelo integrado na aplicação implementation 'com.google.mlkit:barcode-scanning:16.0.3' // Modelo disponível pelos Google Play Services implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:16.1.2' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 47

Slide 47 text

// Se utilizarmos a versão não integrada // É opcional, mas recomendado para transferir automaticamente os modelos ... Como utilizar? Importar a biblioteca AndroidManifest.xml

Slide 48

Slide 48 text

Exemplo ● Limites ○ (49,125), (172,125), (172,160), (49,160) ● Valor ○ 2404105001722

Slide 49

Slide 49 text

Exemplo ● Limites ○ (87,87) (612,87) (612,612) (87,612) ● Valor ○ WIFI:S:SB1Guest;P:12345;T:WEP;; ○ SSID - SB1Guest ○ Password - 12345 ○ Type - WEP

Slide 50

Slide 50 text

https://developers.google.com/ml-kit/vision/barcode-scanning

Slide 51

Slide 51 text

Demo https://github.com/googlesamples/mlkit

Slide 52

Slide 52 text

● Detetar rostos ● Identificar características faciais ● Obter os contornos dos rostos Deteção de caras Visão

Slide 53

Slide 53 text

Deteção de caras Funcionalidade Não integrado na app Integrado na app Implementação O modelo é carregado dinamicamente do Google Play Services O modelo é integrado na aplicação em tempo de compilação Tamanho do APK Sem impacto ≈ 16MB Tempo de inicialização Poderá ser necessário esperar que o modelo seja transferido antes do primeiro uso O modelo está disponível imediatamente

Slide 54

Slide 54 text

dependencies { // Modelo integrado na aplicação implementation 'com.google.mlkit:face-detection:16.0.2' // Modelo disponível pelos Google Play Services implementation 'com.google.android.gms:play-services-mlkit-face-detection:16.1.1' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 55

Slide 55 text

// Se utilizarmos a versão não integrada // É opcional, mas recomendado para transferir automaticamente os modelos ... Como utilizar? Importar a biblioteca AndroidManifest.xml

Slide 56

Slide 56 text

Exemplo ● Cara ○ (884.880004882812, 149.546676635742), (1030.77197265625, 149.546676635742), (1030.77197265625, 329.660278320312), (884.880004882812, 329.660278320312) ● Olho esquerdo ○ (945.869323730469, 211.867126464844) ● Olho direito ○ (971.579467773438, 247.257247924805) ● Boca ○ (907.756591796875, 259.714477539062) ● Probabilidade ○ Sorriso - 0.88979166746139526 ○ Olho esquerdo aberto - 0.98635888937860727 ○ Olho direito aberto - 0.99258323386311531 Deteção de caras

Slide 57

Slide 57 text

Exemplo ● Nariz ○ (505.149811, 221.201797), (506.987122, 313.285919) ● Olho esquerdo ○ (404.642029, 232.854431), (408.527283, 231.366623), (413.565796, 229.427856), (421.378296, 226.967682), (432.598755, 225.434143), (442.953064, 226.089508), (453.899811, 228.594818), (461.516418, 232.650467), (465.069580, 235.600845), (462.170410, 236.316147), (456.233643, 236.891602), (446.363922, 237.966888), (435.698914, 238.149323), (424.320740, 237.235168), (416.037720, 236.012115), (409.983459, 234.870300) ● Parte de cima do lábio ○ (421.662048, 354.520813), (428.103882, 349.694061), (440.847595, 348.048737), (456.549988, 346.295532), (480.526489, 346.089294), (503.375702, 349.470459), (525.624634, 347.352783), (547.371155, 349.091980), (560.082031, 351.693268), (570.226685, 354.210175), (575.305420, 359.257751) Contorno da cara

Slide 58

Slide 58 text

https://developers.google.com/ml-kit/vision/face-detection

Slide 59

Slide 59 text

Demo https://github.com/googlesamples/mlkit

Slide 60

Slide 60 text

● Detetar e extrair informações dos objetos ● Identifica objetos, locais, espécies de animais, produtos, entre outros ● Consegue identificar cerca de 400 entidades diferentes Classificação de imagens Visão

Slide 61

Slide 61 text

Classificação de imagens Funcionalidade Não integrado na app Integrado na app Implementação O modelo é carregado dinamicamente do Google Play Services O modelo é integrado na aplicação em tempo de compilação Tamanho do APK Sem impacto ≈ 3MB Tempo de inicialização Poderá ser necessário esperar que o modelo seja transferido antes do primeiro uso O modelo está disponível imediatamente

Slide 62

Slide 62 text

dependencies { // Modelo integrado na aplicação implementation 'com.google.mlkit:image-labeling:17.0.0' // Modelo disponível pelos Google Play Services implementation 'com.google.android.gms:play-services-mlkit-image-labeling:16.0.0' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 63

Slide 63 text

// Se utilizarmos a versão não integrada // É opcional, mas recomendado para transferir automaticamente os modelos ... Como utilizar? Importar a biblioteca AndroidManifest.xml

Slide 64

Slide 64 text

Exemplo Classificação de imagens Texto Confiança Estádio 0.9205354 Desporto 0.7531109 Evento 0.66905296 Lazer 0.59904146 Futebol 0.56384534 Rede 0.54679185 Planta 0.524364

Slide 65

Slide 65 text

https://developers.google.com/ml-kit/vision/image-labeling

Slide 66

Slide 66 text

Demo https://cloud.google.com/vision/docs/drag-and-drop

Slide 67

Slide 67 text

● Localizar e seguir até 5 objetos diretamente da câmera ou de uma imagem, fornecendo a sua posição e um ID que permite identificar esse objeto num vídeo ● Permite personalizar a classificação de objetos com modelos do TensorFlow Lite Detectar e seguir objetos Visão

Slide 68

Slide 68 text

dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:object-detection:16.2.1' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 69

Slide 69 text

Detetar e seguir objetos Limites (95, 45), (496, 45), (496, 240), (95, 240) Categoria PLACE Confiança 0.9296875 Limites (84, 46), (478, 46), (478, 247), (84, 247) Categoria PLACE Confiança 0.8710938 Limites (53, 45), (519, 45), (519, 240), (53, 240) Categoria PLACE Confiança 0.8828125

Slide 70

Slide 70 text

Exemplo Detetar e seguir objetos Objeto 1 Limites (1, 97), (332, 97), (332, 332), (1, 332) Categoria FASHION_GOOD Confiança 0.95703125 Objeto 2 Limites (186, 80), (337, 80), (337, 226), (186, 226) Categoria FASHION_GOOD Confiança 0.84375 Objeto 3 ... Objeto 4 ...

Slide 71

Slide 71 text

https://developers.google.com/ml-kit/vision/object-detection

Slide 72

Slide 72 text

● Reconhecimento e extração de texto de imagens ● Facilita a deteção de cartões de crédito, recibos ou cartões de visita Reconhecimento de texto Visão

Slide 73

Slide 73 text

Exemplo Reconhecimento de texto Texto reconhecido Texto Wege der parlamentarischen Demokratie Bloco 0 Texto Wege der parlamentarischen Demokratie Frame (117.0, 258.0, 190.0, 83.0) Limites (117, 270), (301.64, 258.49), (306.05, 329.36), (121.41, 340.86) Língua reconhecida de Linha 0 Texto Wege der Elemento 0 Texto Wege

Slide 74

Slide 74 text

dependencies { // Apenas disponível pelos Google Play Services implementation 'com.google.android.gms:play-services-mlkit-text-recognition:16.1.1' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 75

Slide 75 text

// Se utilizarmos a versão não integrada // É opcional, mas recomendado para transferir automaticamente os modelos ... Como utilizar? Importar a biblioteca AndroidManifest.xml

Slide 76

Slide 76 text

https://developers.google.com/ml-kit/vision/text-recognition

Slide 77

Slide 77 text

● Reconhece texto manuscrito e formas desenhadas à mão numa superfície digital ● Usa a mesma tecnologia utilizada no teclado GBoard e Google tradutor para deteção de escrita manual Reconhecimento de escrita Visão

Slide 78

Slide 78 text

dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:digital-ink-recognition:16.0.0' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 79

Slide 79 text

Exemplo Reconhecimento de escrita Traço 1 x 392, 391, 389, 287, ... y 52, 60, 76, 97, ... t 0, 37, 56, 75, ... Traço 2 x 497, 494, 493, 490, ... y 167, 165, 165, 165, ... t 694, 742, 751, 770, ... ...

Slide 80

Slide 80 text

Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 handw #2 handrw #3 hardw #4 handu #5 handwe ...

Slide 81

Slide 81 text

Exemplo Reconhecimento de escrita Traço 1 x 269, 266, 262, 255, ... y 40, 40, 40, 41, ... t 0, 36, 56, 75, ... Traço 2 x 179, 182, 183, 185, ... y 157, 158, 159, 160, ... t 2475, 2522, 2531, 2541, ... ...

Slide 82

Slide 82 text

Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 (U+1f62d) #2 (U+1f605) #3 (U+1f639) #4 (U+1f604) #5 (U+1f606) ...

Slide 83

Slide 83 text

https://developers.google.com/ml-kit/vision/digital-ink-recognition

Slide 84

Slide 84 text

Demo https://quickdraw.withgoogle.com/

Slide 85

Slide 85 text

● Permite detetar a posição do corpo humano em tempo real de um vídeo ou de uma imagem estática ● Detecta partes do corpo humano tais como ombros e cintura Deteção de poses Visão

Slide 86

Slide 86 text

Deteção de poses Funcionalidade Deteção Base Deteção precisa Implementação O modelo é integrado na aplicação em tempo de compilação O modelo é integrado na aplicação em tempo de compilação Tamanho do APK ≈ 6.6MB ≈ 20MB Performance Pixel 4: ~30FPS Pixel 4: ~21FPS

Slide 87

Slide 87 text

dependencies { // Apenas disponível integrado na aplicação // SDK base implementation 'com.google.mlkit:pose-detection:17.0.0' // SDK com precisão implementation 'com.google.mlkit:pose-detection-accurate:17.0.0' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 88

Slide 88 text

Exemplo Deteção de poses

Slide 89

Slide 89 text

Exemplo Deteção de poses Marco Tipo Posição Está no frame? 0 NOSE 506.89526, 232.98584 0.9999994 1 LEFT_EYE_INNER 524.4051, 212.25941 0.9999995 2 LEFT_EYE 535.0669, 212.34688 0.99999946 3 LEFT_EYE_OUTER 545.6083, 212.80696 0.9999991 4 RIGHT_EYE_INNER 495.92175, 210.01476 0.9999995 5 RIGHT_EYE 485.4411, 209.35492 0.99999946 6 RIGHT_EYE_OUTER 475.10806, 208.29173 0.9999988 7 LEFT_EAR 560.1211, 223.12553 0.9999993

Slide 90

Slide 90 text

https://developers.google.com/ml-kit/vision/pose-detection

Slide 91

Slide 91 text

Demo https://github.com/googlesamples/mlkit

Slide 92

Slide 92 text

● Permite detetar o idioma apenas com algumas palavras ● Consegue identificar mais de 100 idiomas diferentes Identificação do idioma Linguagem natural

Slide 93

Slide 93 text

Identificação simples de idioma "My hovercraft is full of eels." en (English) "Dao shan xue hai" zh-Latn (Latinized Chinese) "ph'nglui mglw'nafh wgah'nagl fhtagn" und (undetermined) Distribuição de confiança "an amicable coup d'etat" en (0.52) fr (0.44) ca (0.03) Exemplo Identificação do idioma

Slide 94

Slide 94 text

dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:language-id:16.1.1' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 95

Slide 95 text

https://developers.google.com/ml-kit/language/identification

Slide 96

Slide 96 text

● Permite traduzir entre 58 idiomas, tudo no dispositivo, mas apenas para traduções simples ● Permite transferir outros idiomas (30MB cada) Tradução no dispositivo Linguagem natural

Slide 97

Slide 97 text

dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:translate:16.1.1' } Como utilizar? Importar a biblioteca app/build.gradle

Slide 98

Slide 98 text

https://developers.google.com/ml-kit/language/translation

Slide 99

Slide 99 text

Demo play.google.com/store/apps/details?&id=com.google.android.apps.translate

Slide 100

Slide 100 text

● Gera sugestões relevantes de respostas em conversas de texto ● Utiliza o contexto de toda a conversa para dar sugestões ● Tudo no dispositivo, sem necessitar de enviar as conversas para o servidor ● Apenas funciona em Inglês Sugestões de respostas Linguagem natural

Slide 101

Slide 101 text

dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:smart-reply:16.1.1' } ... android { aaptOptions { // Desactivar a compressão de ficheiros ‘tflite’ noCompress “tflite” } } Como utilizar? Importar a biblioteca app/build.gradle

Slide 102

Slide 102 text

Conversa UserID Utilizador local? Mensagem true “are you on your way?” FRIEND0 false “Running late, sorry!” Exemplo Sugestões de respostas Sugestão de respostas Sugestão #1 Sugestão #2 Sugestão #3 No worries No problem!

Slide 103

Slide 103 text

https://developers.google.com/ml-kit/language/smart-reply

Slide 104

Slide 104 text

https://developers.google.com/ml-kit

Slide 105

Slide 105 text

https://developers.google.com/ml-kit

Slide 106

Slide 106 text

https://developers.google.com/ml-kit

Slide 107

Slide 107 text

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

Slide 108

Slide 108 text

VS Ronda 8

Slide 109

Slide 109 text

class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } } Scope

Slide 110

Slide 110 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.start() } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } }

Slide 111

Slide 111 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.start() } private fun addDogAction() { viewModel.start() val dog = getDog() if (dog.isEating()) { loadImage(dog) } } }

Slide 112

Slide 112 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewModel.start() } private fun addDogAction() { viewModel.start() val dog = getDog() if (dog.isEating()) { viewModel.start() loadImage(dog) } } }

Slide 113

Slide 113 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } }

Slide 114

Slide 114 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } }

Slide 115

Slide 115 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } } }

Slide 116

Slide 116 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } val breed = dog.breed } }

Slide 117

Slide 117 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val food = dog.food } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } val breed = dog.breed } }

Slide 118

Slide 118 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val food = dog.food } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } val breed = dog.breed } } ⚠ Unresolved reference: dog ⚠

Slide 119

Slide 119 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { loadImage(dog) } } }

Slide 120

Slide 120 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } } }

Slide 121

Slide 121 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } Log.d(TAG, food) } }

Slide 122

Slide 122 text

Scope class HomeFragment : Fragment() { private val viewModel by viewModels() override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) } private fun addDogAction() { val dog = getDog() if (dog.isEating()) { val food = dog.food loadImage(dog) } Log.d(TAG, food) } } ⚠ Unresolved reference: food ⚠

Slide 123

Slide 123 text

Funções com scope run… with… run... let… apply… also... Precisam de: retornar uma instância do objeto que estão a aceder? sim.

Slide 124

Slide 124 text

Funções com scope Dog fifi = new Dog().Builder(“Fifi”) .age(2) .breed(“Yorkshire Terrier”) .weight(2.5) .build(); apply val fifi = Dog(“Fifi”).apply { age = 2 breed = “Yorkshire Terrier” weight = 2.5 }

Slide 125

Slide 125 text

private var age = 20 val fifi = Dog(“Fifi”).apply { age = 2 breed = “Yorkshire Terrier” weight = 2.5 } Funções com scope apply

Slide 126

Slide 126 text

Funções com scope apply private var age = 20 val fifi = Dog(“Fifi”).apply { age = 2 breed = “Yorkshire Terrier” weight = 2.5 this.age = age }

Slide 127

Slide 127 text

private var age = 20 val fifi = Dog(“Fifi”).apply { age = 2 breed = “Yorkshire Terrier” weight = 2.5 this.age = age } Funções com scope apply ⚠ this.age corresponds to Dog.age ⚠

Slide 128

Slide 128 text

Funções com scope Dog fifi = new Dog().Builder(“Fifi”) .age(2) .breed(“Yorkshire Terrier”) .weight(2.5) .build(); also val fifi = Dog(“Fifi”).also { fifi -> fifi.age = 2 fifi.breed = “Yorkshire Terrier” fifi.weight = 2.5 }

Slide 129

Slide 129 text

private var age = 20 val fifi = Dog(“Fifi”).also { fifi -> fifi.age = 2 fifi.breed = “Yorkshire Terrier” fifi.weight = 2.5 this.age = fifi.age } Funções com scope also

Slide 130

Slide 130 text

private var age = 20 val fifi = Dog(“Fifi”).also { fifi -> fifi.age = 2 fifi.breed = “Yorkshire Terrier” fifi.weight = 2.5 this.age = fifi.age } Funções com scope also ⚠ this.age corresponds to var age ⚠

Slide 131

Slide 131 text

Funções com scope run… with… run... let… apply… also... Precisam de: retornar uma instância do objeto que estão a aceder? não.

Slide 132

Slide 132 text

Funções com scope run… with… run... let… apply… also... Precisam de: retornar uma instância do objeto que estão a aceder? não. confirmar que não é null, encadear com outras funções, etc.? sim.

Slide 133

Slide 133 text

Funções com scope List breeds = getBreedsList() int size = 0; List nonNullBreeds = new LinkedList() for (String breed : breeds) { if (breed != null) { size++; nonNullBreeds.add(breed) } } doSomeOperation(nonNullBreeds) let val breeds: List? = getBreedsList() val size = breeds?.let { doSomeOperation(it) it.size }

Slide 134

Slide 134 text

private var age = 20 val breeds: List? = getBreedsList() val size = breeds?.let { doSomeOperation(it) it.size } Funções com scope let

Slide 135

Slide 135 text

private var age = 20 val breeds: List? = getBreedsList() val size = breeds?.let { doSomeOperation(it) it.size age = 20 } Funções com scope let ⚠ age corresponds to var age ⚠

Slide 136

Slide 136 text

private var age = 20 val breeds: List? = getBreedsList() val size = breeds?.let { doSomeOperation(it) it.size this.age = 20 } Funções com scope let ⚠ age corresponds to var age ⚠

Slide 137

Slide 137 text

Funções com scope List breeds = getBreedsList() int size = 0; List nonNullBreeds = new LinkedList() for (String breed : breeds) { if (breed != null) { size++; nonNullBreeds.add(breed) } } doSomeOperation(nonNullBreeds) let val breeds: List? = getBreedsList() val size = breeds?.run { doSomeOperation(it) size }

Slide 138

Slide 138 text

val breeds: List? = getBreedsList() val size = breeds?.run { doSomeOperation(it) size } Funções com scope let ⚠ O scope de run é a própria lista ⚠

Slide 139

Slide 139 text

Natal Photo by Mel Poole Unsplash

Slide 140

Slide 140 text

Testar novas funcionalidades Para ativar: 1. Definições 2. Sistema 3. Opções de programador 4. Alterações de compatibilidade da aplicação

Slide 141

Slide 141 text

Google I/O Android app https://github.com/google/iosched Aplicação utilizada anualmente na conferência Google I/O. É actualizada em cada evento de forma a estar de acordo com as últimas novidades de: ● Material design ● Arquitectura ● Bibliotecas ● Componentes

Slide 142

Slide 142 text

Plaid https://github.com/android/plaid Desenvolvida para mostrar as potencialidades do material design. O repositório contém referências para artigos e apresentações de como esta aplicação tem sido actualizada ao longo dos anos.

Slide 143

Slide 143 text

Sunflower https://github.com/android/sunflower Desenvolvida para demonstrar algumas das bibliotecas do Android Jetpack.

Slide 144

Slide 144 text

tivi https://github.com/chrisbanes/tivi Aplicação desenvolvida com o objetivo de demonstrar as últimas bibliotecas e ferramentas disponíveis no Android: ● Inteiramente escrita em Kotlin ● Kotlin Coroutines ● Jetpack: ○ Room ○ Lifecycle ○ Nativation ○ Hilt ● Algumas partes já em Compose

Slide 145

Slide 145 text

Pokedex https://github.com/skydoves/Pokedex Uma aplicação desenvolvida independentemente que faz uso das bibliotecas mais conhecidas seguindo uma arquitetura MVVM: ● Kotlin c/ Coroutines e Flow ● Hilt (dependency injection) ● Jetpack ○ LiveData ○ Lifecycle ○ ViewModel ○ Room ● Retrofit ● Moshi ● etc.

Slide 146

Slide 146 text

Trabalho Para Casa ‍‍

Slide 147

Slide 147 text

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

Slide 148

Slide 148 text

Dúvidas?

Slide 149

Slide 149 text

Continuamos a responder no discord

Slide 150

Slide 150 text

Obrigado ‍♀

Slide 151

Slide 151 text

Android Training Program PORTUGAL Aula #10 Tensorflow Lite no Android Próxima aula: 10 de Dezembro