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

Android Training Program - Portugal, Aula 9

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.

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. • Detetar rostos • Identificar características faciais • Obter os

    contornos dos rostos Deteção de caras Visão
  31. 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
  32. 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
  33. // 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
  34. 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
  35. 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
  36. • 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
  37. 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
  38. 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
  39. // 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
  40. 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
  41. • 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
  42. 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
  43. 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 ...
  44. • 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
  45. 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
  46. 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
  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="ocr" /> <!-- To use multiple models: android:value="ocr,model2,model3" --> </application> Como utilizar? Importar a biblioteca AndroidManifest.xml
  48. • 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
  49. 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, ... ...
  50. 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, ... ...
  51. Exemplo Reconhecimento de escrita Resultados do reconhecimento #1 (U+1f62d) #2

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

    Consegue identificar mais de 100 idiomas diferentes Identificação do idioma Linguagem natural
  57. 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
  58. • 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
  59. • 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
  60. 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
  61. 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!
  62. 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
  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() { 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()) { loadImage(dog) } } }
  65. 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) } } }
  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()) { 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) } } }
  69. 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 } }
  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 } }
  71. 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 ⚠
  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()) { 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) } } }
  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) } }
  75. 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 ⚠
  76. Funções com scope run… with… run... let… apply… also... Precisam

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

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

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

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