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

Android Training Program - Portugal, Aula 9

9e9eb825c69d719f2d3c32bdd3bc971e?s=47 ATP Portugal
December 09, 2020

Android Training Program - Portugal, Aula 9

Aula #9 ML Kit: Machine Learning para iniciantes 🧩

O ML Kit traz a experiência de Machine learning da Google aos programadores de dispositivos móveis num pacote poderoso e fácil de usar. Torna as tuas aplicações iOS e Android mais atrativas, personalizados e úteis com soluções otimizadas para execução no dispositivo.

9e9eb825c69d719f2d3c32bdd3bc971e?s=128

ATP Portugal

December 09, 2020
Tweet

Transcript

  1. Android Training Program PORTUGAL Aula #9 ML Kit: Machine Learning

    para iniciantes
  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 Machine Learning • ML Kit • 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-aula9

  11. Resumo da Aula #8

  12. • 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
  13. • 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
  14. • 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
  15. • 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
  16. • 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
  17. Aula #9

  18. Luiz Gustavo @gusthema TensorFlow Developer Advocate Google O que é

    Machine Learning?
  19. Machine Learning

  20. None
  21. Machine learning Algoritmos Deep learning Inteligência artificial ...

  22. • 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
  23. Photo by Eugene Chystiakovl

  24. 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
  25. theverge.com/2019/10/30/20939147/deepmind-google-alphastar-starcraft-2-research-grandmaster-level

  26. • 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
  27. • 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
  28. • 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
  29. https://about.google/intl/ALL_us/stories/seeingpotential/

  30. • 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
  31. Navegação com uma conta registada

  32. Navegação em modo anónimo

  33. • 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
  34. • 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 • <a tua ideia> O mundo à nossa volta Onde é aplicado? Photo by Gustavo Quepón
  35. https://about.google/intl/ALL_us/stories/save-the-bees/

  36. • 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
  37. • 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
  38. ML Kit

  39. • 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
  40. • 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
  41. • 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
  42. • 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
  43. Visão Linguagem natural

  44. • 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
  45. 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
  46. 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
  47. // Se utilizarmos a versão não integrada // É opcional,

    mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="barcode" /> <!-- To use multiple models: android:value="barcode,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml
  48. Exemplo • Limites ◦ (49,125), (172,125), (172,160), (49,160) • Valor

    ◦ 2404105001722
  49. Exemplo • Limites ◦ (87,87) (612,87) (612,612) (87,612) • Valor

    ◦ WIFI:S:SB1Guest;P:12345;T:WEP;; ◦ SSID - SB1Guest ◦ Password - 12345 ◦ Type - WEP
  50. https://developers.google.com/ml-kit/vision/barcode-scanning

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

  52. • Detetar rostos • Identificar características faciais • Obter os

    contornos dos rostos Deteção de caras Visão
  53. 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
  54. 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
  55. // Se utilizarmos a versão não integrada // É opcional,

    mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="face" /> <!-- To use multiple models: android:value="face,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml
  56. 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
  57. 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
  58. https://developers.google.com/ml-kit/vision/face-detection

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

  60. • 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
  61. 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
  62. 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
  63. // Se utilizarmos a versão não integrada // É opcional,

    mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="ica" /> <!-- To use multiple models: android:value="ica,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml
  64. 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
  65. https://developers.google.com/ml-kit/vision/image-labeling

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

  67. • 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
  68. 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
  69. 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
  70. 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 ...
  71. https://developers.google.com/ml-kit/vision/object-detection

  72. • 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
  73. 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
  74. 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
  75. // Se utilizarmos a versão não integrada // É opcional,

    mas recomendado para transferir automaticamente os modelos <application ...> ... <meta-data android:name="com.google.mlkit.vision.DEPENDENCIES" android:value="ocr" /> <!-- To use multiple models: android:value="ocr,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml
  76. https://developers.google.com/ml-kit/vision/text-recognition

  77. • 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
  78. 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
  79. 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, ... ...
  80. Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 handw #2

    handrw #3 hardw #4 handu #5 handwe ...
  81. 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, ... ...
  82. Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 (U+1f62d) #2

    (U+1f605) #3 (U+1f639) #4 (U+1f604) #5 (U+1f606) ...
  83. https://developers.google.com/ml-kit/vision/digital-ink-recognition

  84. Demo https://quickdraw.withgoogle.com/

  85. • 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
  86. 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
  87. 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
  88. Exemplo Deteção de poses

  89. 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
  90. https://developers.google.com/ml-kit/vision/pose-detection

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

  92. • Permite detetar o idioma apenas com algumas palavras •

    Consegue identificar mais de 100 idiomas diferentes Identificação do idioma Linguagem natural
  93. 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
  94. 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
  95. https://developers.google.com/ml-kit/language/identification

  96. • 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
  97. dependencies { // Apenas disponível integrado na aplicação implementation 'com.google.mlkit:translate:16.1.1'

    } Como utilizar? Importar a biblioteca app/build.gradle
  98. https://developers.google.com/ml-kit/language/translation

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

  100. • 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
  101. 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
  102. 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!
  103. https://developers.google.com/ml-kit/language/smart-reply

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

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

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

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

  108. VS Ronda 8

  109. class HomeFragment : Fragment() { private val viewModel by viewModels<HomeViewModel>()

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

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

    viewModels<HomeViewModel>() 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) } } }
  112. Scope class HomeFragment : Fragment() { private val viewModel by

    viewModels<HomeViewModel>() 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) } } }
  113. Scope class HomeFragment : Fragment() { private val viewModel by

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

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

    viewModels<HomeViewModel>() 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) } } }
  116. Scope class HomeFragment : Fragment() { private val viewModel by

    viewModels<HomeViewModel>() 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 } }
  117. Scope class HomeFragment : Fragment() { private val viewModel by

    viewModels<HomeViewModel>() 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 } }
  118. Scope class HomeFragment : Fragment() { private val viewModel by

    viewModels<HomeViewModel>() 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 ⚠
  119. Scope class HomeFragment : Fragment() { private val viewModel by

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

    viewModels<HomeViewModel>() 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) } } }
  121. Scope class HomeFragment : Fragment() { private val viewModel by

    viewModels<HomeViewModel>() 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) } }
  122. Scope class HomeFragment : Fragment() { private val viewModel by

    viewModels<HomeViewModel>() 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 ⚠
  123. Funções com scope run… with… run... let… apply… also... Precisam

    de: retornar uma instância do objeto que estão a aceder? sim.
  124. 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 }
  125. private var age = 20 val fifi = Dog(“Fifi”).apply {

    age = 2 breed = “Yorkshire Terrier” weight = 2.5 } Funções com scope apply
  126. 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 }
  127. 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 ⚠
  128. 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 }
  129. 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
  130. 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 ⚠
  131. 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.
  132. 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.
  133. Funções com scope List<Dog> breeds = getBreedsList() int size =

    0; List<Dog> nonNullBreeds = new LinkedList<String>() for (String breed : breeds) { if (breed != null) { size++; nonNullBreeds.add(breed) } } doSomeOperation(nonNullBreeds) let val breeds: List<Dog>? = getBreedsList() val size = breeds?.let { doSomeOperation(it) it.size }
  134. private var age = 20 val breeds: List<Dog>? = getBreedsList()

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

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

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

    0; List<Dog> nonNullBreeds = new LinkedList<Dog>() for (String breed : breeds) { if (breed != null) { size++; nonNullBreeds.add(breed) } } doSomeOperation(nonNullBreeds) let val breeds: List<Dog>? = getBreedsList() val size = breeds?.run { doSomeOperation(it) size }
  138. val breeds: List<Dog>? = getBreedsList() val size = breeds?.run {

    doSomeOperation(it) size } Funções com scope let ⚠ O scope de run é a própria lista ⚠
  139. Natal Photo by Mel Poole Unsplash

  140. Testar novas funcionalidades Para ativar: 1. Definições 2. Sistema 3.

    Opções de programador 4. Alterações de compatibilidade da aplicação
  141. 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
  142. 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.
  143. Sunflower https://github.com/android/sunflower Desenvolvida para demonstrar algumas das bibliotecas do Android

    Jetpack.
  144. 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
  145. 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.
  146. Trabalho Para Casa ‍‍

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

  148. Dúvidas?

  149. Continuamos a responder no discord

  150. Obrigado ‍♀

  151. Android Training Program PORTUGAL Aula #10 Tensorflow Lite no Android

    Próxima aula: 10 de Dezembro