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

Android Training Program - Portugal, Aula 0

Android Training Program - Portugal, Aula 0

Aula #0: Pronto para começar 🎒

Bem-vindos! Esta primeira aula é de suporte. Vamos-te ensinar a instalar o Android Studio, a configurar o emulador e/ ou o teu telemóvel Android, e ainda a instalares a tua primeira aplicação de forma a garantir que tens tudo pronto para começar.

- Instalar o Android Studio
- Configurar o Emulador
- Criar a tua primeira aplicação

ATP Portugal

October 14, 2020
Tweet

More Decks by ATP Portugal

Other Decks in Programming

Transcript

  1. Android
    Training
    Program
    PORTUGAL
    Aula #0
    Pronto para começar

    View full-size slide

  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

    View full-size slide

  3. Log.d(“Olá Mundo ”)

    View full-size slide

  4. ● Apresentação do programa
    ● Introdução ao Git/GitHub
    ● Introdução ao Kotlin
    ● Android Studio
    ● Cria a tua aplicação
    Sumário
    Photo by Mika Baumeister on Unsplash

    View full-size slide

  5. Andres-Leonardo
    Martinez-Ortiz
    Google
    Carlos Mota
    Formador
    Renato Almeida
    Formador
    @davilagrau @cafonsomota @tallnato
    Equipa

    View full-size slide

  6. ● 14 eventos
    ● 11 cidades
    ● 11 instituições
    ● 3267 participantes
    Edições anteriores

    View full-size slide

  7. Apresentação do programa

    View full-size slide

  8. ● Aprender Android desde os conceitos mais simples aos mais avançados:
    ○ Android Jetpack
    ○ Firebase
    ○ TensorFlow Lite
    ○ ML Kit
    ● Todo o código será escrito em Kotlin
    ● Desenvolvimento de uma aplicação Android de raiz
    ● Recorrendo às últimas novidades:
    ○ Android 11
    ○ Jetpack Compose
    Desenhado para
    o Android 11!
    Apresentação do programa

    View full-size slide

  9. ● Adicionalmente teremos ainda uma breve introdução ao Flutter
    ● Suporte contínuo durante todo o programa
    ● Complemento às aulas dadas nas diferentes instituições de ensino
    ● Grátis
    Apresentação do programa

    View full-size slide

  10. ● 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
    Apresentação do programa

    View full-size slide

  11. #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

    View full-size slide

  12. ● [05 mins] Apresentação do curso, resumo da sessão anterior e da atual
    ● [30 mins] Conteúdo da aula
    ● [15 mins] Formador convidado: parceiro, Googler, GDE, etc.
    ● [30 mins] Continuação do conteúdo da aula
    ● [10 mins] Q&A
    ● [05 mins] Resumo
    Aulas

    View full-size slide

  13. http://events.withgoogle.com/atp2020
    [email protected]
    http://bit.ly/atp2020-youtube
    http://bit.ly/atp2020-discord
    Links

    View full-size slide

  14. A evolução das
    aplicações móveis

    View full-size slide

  15. Nokia 3310
    Snake

    View full-size slide

  16. Pixel 3
    Pokémon Go (AR)

    View full-size slide

  17. (quando começamos, 2009)
    ● Android 1.6 (Donut)
    ● 528MHz CPU
    ● 288MB RAM
    ● Ecrã TFT 65k
    ● Trackball
    ● Sem câmera frontal
    ● 3.15MP câmera
    HTC Magic
    (actualmente)
    Pixel 5
    ● Android 11
    ● Octa-core CPU
    ● 8GB RAM
    ● Ecrã OLED, 90Hz
    ● Todo o ecrã é tátil
    ● 8MP câmera frontal
    ● 12.2 e 16MP câmera
    Android

    View full-size slide


  18. (quando começamos, 2009)
    HTC Magic
    (actualmente)
    Pixel 5
    Android

    View full-size slide

  19. versões
    Android 11
    Android 10
    Apple Pie
    1.0
    Cupcake
    1.5
    Donut
    1.6
    Eclair
    2.0/2.1
    Froyo
    2.2
    Gingerbread
    2.3.x
    Honeycomb
    3.x
    Ice Cream Sandwich
    4.0
    Jelly Bean
    4.1-4.3
    KitKat
    4.4
    Lollipop
    5.0
    Marshmallow
    6.0
    Nougat
    7.0
    Oreo
    8.0
    Pie
    9.0
    Android

    View full-size slide

  20. *ícones de flaticon.com
    Rabanadas
    11
    Queijadinha
    10
    Arroz Doce
    1.0
    Cornucópia
    1.5
    Filhoses
    2.2
    Gargantas de Freira
    2.3.x

    3.x

    4.0
    Jesuítas
    4.1-4.3
    Molotoff
    6.0
    Nata
    7.0
    Ovos Moles
    8.0
    Pudim de Abade de
    Priscos 9.0
    Leite Creme
    5.0
    Doce da Casa
    1.6
    Escarpiada
    2.0/2.1

    4.4
    versões Portuguesas
    Android

    View full-size slide

  21. Android 11
    Android 10
    Apple Pie
    1.0
    Cupcake
    1.5
    Donut
    1.6
    Eclair
    2.0/2.1
    Froyo
    2.2
    Gingerbread
    2.3.x
    Honeycomb
    3.x
    Ice Cream Sandwich
    4.0
    Jelly Bean
    4.1-4.3
    KitKat
    4.4
    Lollipop
    5.0
    Marshmallow
    6.0
    Nougat
    7.0
    Oreo
    8.0
    Pie
    9.0
    que sobremesas
    seriam no teu
    país?
    (envia-nos uma mensagem no discord/YouTube)
    versões >
    Android

    View full-size slide

  22. Apple Pie Ice Cream
    Sandwich
    KitKat Lollipop Oreo Pie
    Android 1.0 Android 4.0 Android 4.4 Android 5.0 Android 8.0 Android 9.0
    evoluções da UI
    Android
    *adaptado a partir do tweet Luke Wroblewski,
    https://twitter.com/lukew/status/996461585693540352

    View full-size slide

  23. Porque Android?

    View full-size slide

  24. 2.5 mil milhões
    de pessoas usam um dispositivo Android todos os dias

    View full-size slide

  25. ~75%
    de todos os smartphones são Android
    *https://gs.statcounter.com/os-market-share/mobile/worldwide

    View full-size slide

  26. 1.2 mil milhões
    de empregos são gerados diretamente pela plataforma
    Android, só na Europa

    View full-size slide

  27. em todos os dispositivos
    Android

    View full-size slide

  28. Que versão
    de Android
    devo
    escolher?
    distribuição
    Android

    View full-size slide

  29. distribuição
    Android

    View full-size slide

  30. distribuição
    Android

    View full-size slide

  31. Diferentes frameworks
    para programar para
    Android

    View full-size slide

  32. Photo by Lucas Miguel on Unsplash

    View full-size slide

  33. Photo by Brandon Hoogenboom on Unsplash

    View full-size slide

  34. Qualquer tecnologia suficientemente avançada é
    indistinguível da magia.
    - Arthur C. Clarke

    View full-size slide

  35. ● Desenvolvimento nativo
    ○ Java/ Kotlin ❤
    ○ Bibliotecas nativas escritas em C/C++
    ● Híbrido
    ○ PhoneGap, Ionic, etc.
    ● Cross platform
    ○ Flutter, React Native, Xamarin, NativeScript, Ionic, Ruby Motion, etc.
    ● Multiplatforma
    ○ Kotlin (toda a lógica é partilhada por diferentes plataformas, e a UI desenvolvida nativamente)
    Android

    View full-size slide

  36. ✅ Melhor performance
    ✅ Kotlin!
    Tiras o partido de todas as funcionalidades que esta linguagem oferece
    ✅ Acesso directo a todas as API’s/ funcionalidades
    ✅ UI nativa
    Quando o OS é actualizado esta também vai ser
    ✅ Facilidade em debug
    ✅ Possibilidade de criar UI’s complexas e fluidas facilmente™
    desenvolvimento nativo
    Android

    View full-size slide

  37. ❌ Não existe suporte direto para multi platforma
    Reutilização de código apenas existe entre aplicações nativas
    É necessário desenvolver uma segunda aplicação
    Os custos e o tempo de desenvolvimento (em horas) duplicam
    desenvolvimento nativo
    Android

    View full-size slide

  38. Google Maps Pinterest Netflix Pokémon Go
    *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    exemplo de aplicações nativas
    Android

    View full-size slide

  39. ✅ Estas aplicações tanto têm código nativo como Web
    HTML/CSS/JS para desenhar a app e plugins para aceder às funcionalidades nativas
    Apesar de ser uma aplicação, está a correr dentro de um browser (WebKit)
    ✅ Custos de desenvolvimento mais baixos
    Não é necessário ter duas equipas (uma de Android e outra de iOS)
    ✅ Tempos de desenvolvimento (em horas) mais rápidos
    ✅ Curva de aprendizagem para programadores Web reduzida
    Grande parte destas ferramentas têm por base linguagens Web já conhecidas
    desenvolvimento híbrido
    Android

    View full-size slide

  40. ❌ Aceder a novas API’s pode implicar que tenhas de escrever código nativo
    ❌ A performance não é a mesma comparativamente com nativo
    ❌ Suporte offline na maior parte das vezes é inexistente
    ❌ A UX pode não ser a melhor
    desenvolvimento híbrido
    Android

    View full-size slide

  41. Evernote Gmail Untappd JustWatch
    *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    exemplo de aplicações híbridas
    Android

    View full-size slide

  42. ✅ Custos de desenvolvimento mais baixos
    Não é necessário ter duas equipas (uma de Android e outra de iOS)
    ✅ Tempos de desenvolvimento (em horas) mais rápidos
    Consegues desenvolver com poucos ajustes para duas plataformas distintas
    Base de código única
    ✅ Melhor performance que as soluções híbridas
    ✅ Visualmente é mais difícil de distinguir de uma aplicação nativa
    desenvolvimento cross-platform
    Android

    View full-size slide

  43. ❌ Dependem da implementação da UI que a framework oferece
    Novos updates no SO, não se refletem imediatamente na aplicação
    ❌ Apesar de melhor, a performance continua a não ser igual à nativa
    ❌ As funcionalidades disponíveis dependem se a framework tem esse suporte
    Se uma das plataformas não tem uma funcionalidade, esta pode não ser disponibilizada para a outra
    ❌ Estás a confiar o teu projecto a uma framework/ linguagem
    O que vai acontecer daqui a 10 anos? Ainda vai ter actualizações a framework?
    desenvolvimento cross-platform
    Android

    View full-size slide

  44. Airbnb Uber Eats Instagram Discord
    *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    exemplo de aplicações cross-platform
    Android

    View full-size slide

  45. Instagram
    exemplo de aplicações cross-platform
    Android

    View full-size slide

  46. ✅ A camada lógica é partilhada entre Android e iOS (e até outras plataformas)
    Consistência entre as várias plataformas
    Custos de desenvolvimento mais baixos
    ✅ Baixo risco
    Não és obrigado a partilhar tudo. Tu decides o que queres partilhar entre ambas as plataformas
    ✅ A UI é desenvolvida nativamente
    Android em Java/Kotlin, iOS em objective-c/swift
    ✅ O código partilhado é desenvolvido em Kotlin
    Tiras partido de todas as funcionalidades que a linguagem te oferece
    ✅ Grande suporte da JetBrains e da comunidade
    desenvolvimento multiplatforma
    Android

    View full-size slide

  47. ❌ Ainda se encontra em alpha
    ❌ Os tempos de compilação para native (iOS) ainda são demorados
    ❌ Fazer debug em iOS não é uma tarefa fácil
    desenvolvimento multiplatforma
    Android

    View full-size slide

  48. *as aplicações são muitas vezes reescritas, por isso é possível que esta informação deixe de ser válida no futuro
    Space Cash App Yandex Maps Workspace
    exemplo de aplicações multiplatforma
    Android

    View full-size slide

  49. Git & GitHub

    View full-size slide

  50. ProjetoATP
    1
    1
    Android Studio
    ProjetoATP_1
    ProjetoATP_Aula3
    ProjetoATP_Final
    ProjetoATP_este
    ProjetoATP_Funciona
    ProjetoATP_FINAL_2
    ProjetoATP_2
    ProjetoATP_FINAL_
    FINAL
    ProjetoATP_FINAL_
    FINAL_A_ENVIAR_E
    STE
    ProjetoATP_FINAL_
    FINAL_A_ENVIAR_E
    STE_2

    View full-size slide

  51. Sistema de
    versionamento

    View full-size slide

  52. ● Sistema de controlo de versões distribuído
    ● Criado por Linus Torvalds (Linux)
    ● Lançado em 2005
    ● Multiplataforma, Linux, Mac OS e Windows
    Git

    View full-size slide

  53. Main
    Requisito 1
    Git

    View full-size slide

  54. Git
    Main
    Requisito 1

    View full-size slide

  55. Main
    Requisito 1
    Requisito 2
    Git

    View full-size slide

  56. Main
    Requisito 1
    Requisito 2
    Git

    View full-size slide

  57. Como instalar?

    View full-size slide

  58. highlight this link
    https://git-scm.com/book/en/v2/Getting-Started-Installing-Git

    View full-size slide

  59. ● Plataforma de armazenamento de código
    ● Grátis para projetos de código aberto
    ● Repositórios privados gratuitos para contas pessoais
    ● Todas as funcionalidades disponíveis para contas de Universidade
    GitHub

    View full-size slide

  60. https://github.com/android-training-program

    View full-size slide

  61. Photo by Austin Distel on Unsplash

    View full-size slide

  62. Uma pausa
    com
    Android 4.4

    View full-size slide

  63. Uma pausa
    com
    Mas não saiam dos vossos lugares
    (Não patrocinado infelizmente )
    Kitkat

    View full-size slide

  64. ● Criada pela JetBrains em 2011
    ● Adotada como oficial para Android em 2017
    ● 100% interoperável com Java
    ● Multiplataforma
    ● Orientada a objetos e funcional, concisa e estaticamente tipada
    ● Nome de uma ilha na Rússia
    Kotlin

    View full-size slide

  65. Kotlin não é apenas sobre desenvolveres a tua aplicação com menos linhas de
    código mas sim para escreveres aplicações melhores e mais seguras.
    - Arnaud Giuliani, Android Makers 2017
    Kotlin

    View full-size slide

  66. Null
    safety
    Type
    inference
    Extensions
    String
    interpolation
    Default
    values
    Mutability
    Sealed
    Classes
    Data
    classes Collections
    When
    Kotlin

    View full-size slide

  67. null safety
    Kotlin

    View full-size slide

  68. var nameThatCanBeNull: String?
    var name: String
    null safety
    Kotlin
    null can not be a value of a non-null type String
    name = null
    nameThatCanBeNull = null
    Photo by Aziz Acharki on Unsplash

    View full-size slide

  69. printDog(name ?: "Bobi")
    printDog(name ?: "Bobi")
    var name: String?
    fun printDog(tag: String)
    printDog(name)
    null safety
    Kotlin
    Type mismatch
    Photo by Stephanie Klepacki on Unsplash

    View full-size slide

  70. dog = Dog("Max")
    val dog = Dog("Bobi")
    var doggo = Dog("Bobi")
    mutability
    Kotlin
    Val cannot be reassigned
    doggo = Dog("Max")
    val(ue)
    var(iable)

    View full-size slide

  71. when(dog.legs) {
    0 -> println("Humm... Será mesmo um cão? ")
    1 -> println("Oh, coitadinho ")
    2, 3 -> println("Ao menos consegue caminhar ")
    4 -> { println("Quem é lindo? Busca... ") }
    in 5..10 -> println("Assim mais parece uma ")
    else -> println("Pois, ninguém sabe ")
    }
    when
    Kotlin

    View full-size slide

  72. val dog: Dog = Dog()
    val dog = Dog()
    dog.legs = 4 // Int
    var legs = dog.legs
    dog.legs = 4L //Long
    type inference
    Kotlin
    val animal = getAnimal()
    fun printDog(dog: Dog)
    if(animal is Dog){
    printDog(animal)
    }
    The integer literal does not conform to the expected type Int

    View full-size slide

  73. sealed class Animal {
    data class Dog(val name: String): Animal()
    data class Cat(val name: String): Animal()
    data class Penguin(val name: String): Animal()
    }
    sealed class
    Kotlin
    Photo by Amy Asher on Unsplash

    View full-size slide

  74. public class Dog {
    private String name;
    public Dog(String name) {
    this.name = name;
    }
    public String getName() {
    return name;
    }
    public void setName(String name) {
    this.name = name;
    }
    @Override
    public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Dog dog = (Dog) o;
    return Objects.equals(name, dog.name);
    }
    @Override
    public int hashCode() {
    return Objects.hash(name);
    }
    @Override
    public String toString() {
    return "Dog{" +
    "name='" + name + '\'' +
    '}';
    }
    }
    data class Dog(var name: String)
    data class
    Kotlin

    View full-size slide

  75. fun Int.plus2(): Int {
    return this + 2
    }
    val result = 5.plus2() // 7
    extensions
    Kotlin

    View full-size slide

  76. fun printDog(dog: Dog, legs: Int) {
    println("O " + dog.name + " tem " + legs + " patas")
    fun printNails(dog: Dog, legs: Int) {
    println("O ${dog.name} tem ${legs * 3} unhas")
    }
    printNails(Dog("Bobi"), 4)
    // “O Bobi tem 12 unhas”
    println("O ${dog.name} tem $legs patas")
    }
    string interpolation
    Kotlin

    View full-size slide

  77. fun printDog(name: String = "Bobi", legs: Int = 4) {
    println("O $name tem $legs patas)
    }
    fun printDog(name: String = "Bobi", legs: Int = 4) {
    println("O $name tem $legs patas)
    }
    printDog() // O Bobi tem 4 patas
    printDog("Max") // O Max tem 4 patas
    printDog("Toy", 2) // O Toy tem 2 patas
    printDog( legs = 2, name = "Toy") // O Toy tem 2 patas
    default values
    Kotlin

    View full-size slide

  78. ● getOrElse()
    ● find()
    ● filter()
    ● filterNot()
    ● fitletNotNull()
    ● flatMap()
    ● take()
    ● takeLast()
    ● sortBy()
    ● sortByDescending()
    ● groupBy()
    ● map()
    ● mapNotNull()
    ● all()
    ● any()
    ● sumBy()
    ● zip()
    ● ...
    collections
    Kotlin

    View full-size slide

  79. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [1, null, 2, null, 3, 4, 5, 6, 7, 8, 9]
    collections
    Kotlin

    View full-size slide

  80. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [1, 2, 3, 4, 5, 6, 7, 8, 9]
    collections
    Kotlin

    View full-size slide

  81. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [2, 4, 6, 8]
    collections
    Kotlin

    View full-size slide

  82. mutableListOf(1, null, 2, null, 3, 4, 5, 6, 7, 8, 9)
    .filterNotNull()
    .filter { it % 2 == 0 }
    .sortedDescending()
    > [8, 6, 4, 2]
    collections
    Kotlin

    View full-size slide

  83. Android Server side
    Native
    em todo o lado
    Kotlin
    Web

    View full-size slide

  84. Kotlin Koans

    View full-size slide

  85. https://play.kotlinlang.org/koans/overview

    View full-size slide

  86. Semana 0
    Pronto para começar

    View full-size slide

  87. Desenvolver uma
    aplicação móvel

    View full-size slide

  88. 1. Ter uma ideia


    (o passo mais difícil na realidade)

    View full-size slide

  89. 2. Desenhá-la no papel

    Um título
    Algum texto, não muito. O
    suficiente para conseguir aqui
    ocupar três linhas. Feito.

    View full-size slide

  90. 3. Programá-la

    View full-size slide

  91. 4. Testar todas as funcionalidades

    View full-size slide

  92. 5. Corrigir os problemas encontrados

    View full-size slide

  93. 6. (Re)testar todas as funcionalidades

    View full-size slide

  94. 7. Submeter na Google Play Store

    View full-size slide

  95. https://play.google.com/console

    View full-size slide

  96. 8. Anunciar a todos os amig@s para partilharem


    View full-size slide

  97. 9. Adicionar funcionalidades pagas

    View full-size slide

  98. 10. Reformar e viver dos lucros


    View full-size slide

  99. Android Studio

    View full-size slide

  100. ● Editor oficial para desenvolvimento Android
    ● Baseado no JetBrains' IntelliJ IDE
    ● Multiplataforma (Mac OS, Windows, Linux)
    ● Emulador e gestor de SDK’s pré-instalado
    ● Inspecção de base de dados, visualização e inspeção de UI, etc.
    Android Studio
    https://developer.android.com/studio/

    View full-size slide

  101. https://developer.android.com/studio/

    View full-size slide

  102. Vista de todos os ficheiros do projecto

    View full-size slide

  103. Compilar o
    projeto

    View full-size slide

  104. Dispositivos disponíveis

    View full-size slide

  105. Gestor emuladores ☝

    View full-size slide

  106. Gestor dos SDKs instalados ☝

    View full-size slide

  107. Sincronizar ficheiros Gradle

    View full-size slide

  108. Modo Debug ☝

    View full-size slide

  109. Correr a aplicação no dispositivo

    View full-size slide

  110. Parar a aplicação

    View full-size slide

  111. Output do último comando

    View full-size slide

  112. Logs da aplicação

    View full-size slide

  113. Vista de um layout

    View full-size slide

  114. Paleta de componentes gráficos

    View full-size slide

  115. Atributos da View selecionada

    View full-size slide

  116. Vista do código

    View full-size slide

  117. Vista partilhada

    View full-size slide

  118. Uma novidade fresquinha

    View full-size slide

  119. Novidades de
    hoje! AS 4.1

    View full-size slide

  120. Criar uma aplicação

    View full-size slide

  121. ● Android Developers
    ● Android Codelabs
    ● Android YouTube
    ● Android Medium
    ● Android GitHub
    ● Android Twitter
    ● Google Courses
    Queres aprender mais sobre Android?

    View full-size slide

  122. ● Kotlin Reference Manual
    ● Android Kotlin Fundamentals 01.1: Get started
    ● Kotlin Bootcamp for Programmers
    ● Kotlin Slack
    ● Kotlin Koans
    ● Kotlin Playground
    Mais sobre Kotlin

    View full-size slide

  123. ● Android Developers Backstage
    ● Ícones do Material Design
    ● Asset Generator
    ● Introduction to Github
    E ainda...

    View full-size slide

  124. ● Google Computer Science Curriculum
    ● Udacity Nanodegree
    ● Codecademy
    ● Udemy
    ● Coursera
    ● Khanacademy
    Queres aprender programar?

    View full-size slide

  125. Obrigado
    ‍♀

    View full-size slide

  126. Android
    Training
    Program
    PORTUGAL
    Aula #1
    Bem-vindos ao Android
    Próxima aula: 21 de Outubro

    View full-size slide