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

Android Training Program - Portugal, Aula 9

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for ATP Portugal 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.

Avatar for ATP Portugal

ATP Portugal

December 09, 2020
Tweet

More Decks by ATP Portugal

Other Decks in Education

Transcript

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

    @cafonsomota @tallnato Equipa Daniela Ferreira Gestora de comunidades
  3. ‱ 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
  4. #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 ✅ ✅ ✅ ✅
  5. Sumário Photo by Mika Baumeister on Unsplash ‱ Resumo da

    aula anterior ‱ Introdução ao Machine Learning ‱ ML Kit ‱ Kotlin para principiantes ‱ É Natal
  6. ‱ 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
  7. ‱ 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
  8. ‱ 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
  9. ‱ 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
  10. ‱ 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
  11. ‱ 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
  12. 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
  13. ‱ 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
  14. ‱ 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
  15. ‱ 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
  16. ‱ 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
  17. ‱ 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
  18. ‱ 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
  19. ‱ 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
  20. ‱ 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
  21. ‱ 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
  22. ‱ 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
  23. ‱ 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
  24. ‱ 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
  25. ‱ 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
  26. 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
  27. 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
  28. // 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
  29. Exemplo ‱ Limites ◩ (87,87) (612,87) (612,612) (87,612) ‱ Valor

    ◩ WIFI:S:SB1Guest;P:12345;T:WEP;; ◩ SSID - SB1Guest ◩ Password - 12345 ◩ Type - WEP
  30. 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
  31. 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
  32. // 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
  33. 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
  34. 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
  35. ‱ 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
  36. 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
  37. 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
  38. // 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
  39. 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
  40. ‱ 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
  41. 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
  42. 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 ...
  43. ‱ 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
  44. 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
  45. 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
  46. // 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
  47. ‱ 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
  48. 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, ... ...
  49. 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, ... ...
  50. Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 (U+1f62d) #2

    (U+1f605) #3 (U+1f639) #4 (U+1f604) #5 (U+1f606) ...
  51. ‱ 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
  52. 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
  53. 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
  54. 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
  55. ‱ Permite detetar o idioma apenas com algumas palavras ‱

    Consegue identificar mais de 100 idiomas diferentes Identificação do idioma Linguagem natural
  56. 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
  57. ‱ 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
  58. ‱ 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
  59. 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
  60. 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!
  61. 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
  62. 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) } } }
  63. 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) } } }
  64. 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) } } }
  65. 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) } } }
  66. 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) } } }
  67. 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) } } }
  68. 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 } }
  69. 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 } }
  70. 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 ⚠
  71. 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) } } }
  72. 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) } } }
  73. 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) } }
  74. 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 ⚠
  75. FunçÔes com scope run
 with
 run... let
 apply
 also... Precisam

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

    age = 2 breed = “Yorkshire Terrier” weight = 2.5 } FunçÔes com scope apply
  78. 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 }
  79. 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 ⚠
  80. 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 }
  81. 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
  82. 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 ⚠
  83. 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.
  84. 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.
  85. 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 }
  86. private var age = 20 val breeds: List<Dog>? = getBreedsList()

    val size = breeds?.let { doSomeOperation(it) it.size } FunçÔes com scope let
  87. 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 ⚠
  88. 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 ⚠
  89. 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 }
  90. 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 ⚠
  91. Testar novas funcionalidades Para ativar: 1. DefiniçÔes 2. Sistema 3.

    OpçÔes de programador 4. AlteraçÔes de compatibilidade da aplicação
  92. 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
  93. 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.
  94. 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
  95. 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.