Slide 1

Slide 1 text

Ao infinito e além! Novidades do Jetpack para profissionais Android. ✨ Walmyr Carvalho Founder @ Kusudama, Mobile Technical Leader @ idwall Google Developer Expert, Android @walmyrcarvalho

Slide 2

Slide 2 text

Bom dia, DevCamp! Meu nome é Walmyr Carvalho, muito prazer! :)

Slide 3

Slide 3 text

Trabalho com desenvolvimento Android há 9 anos e sou um Google Developer Experts de Android no Brasil há 3 anos. Além disso, estou muito próximo da comunidade nacional de Android, sendo organizador do GDG São Paulo, Kotlin Meetup São Paulo e Android Dev BR, a maior comunidade brasileira de Android do mundo, com mais de 5700 pessoas!
 
 Também apoio o empreendedorismo nacional, sendo mentor de Android e mobile no Google Developers Launchpad Accelerator e na ACE Startups.

Slide 4

Slide 4 text

Já ajudei a evoluir produtos mobile para empresas como Loggi, 99, Cielo, CI&T, Hotel Urbano e Globo Esporte, durante mais de 9 anos de carreira como especialista em Android. Fonte: Google Play

Slide 5

Slide 5 text

Nesse ano fundei a Kusudama, um estúdio de desenvolvimento e design de produtos digitais para Android e iOS, que tem como seu objetivo criar experiências que tratem seus usuários com respeito dentro do universo mobile.

Slide 6

Slide 6 text

Recentemente me juntei ao grande time da idwall como Mobile Technical Leader, com o objetivo de criar a próxima plataforma de identidade digital brasileira no mobile, além de soluções para empresas que buscam aumentar a confiança na identificação dos seus usuários.

Slide 7

Slide 7 text

Um ano de Android Jetpack! Como foi a trajetória do projeto até agora?

Slide 8

Slide 8 text

Pergunta: Quem aí já usa alguma coisa do Jetpack nos próprios projetos para Android?

Slide 9

Slide 9 text

Fonte: Android Developers

Slide 10

Slide 10 text

O Android Jetpack é um conjunto de ferramentas, bibliotecas e boas práticas criado pelo Google, com o objetivo de ajudar profissionais Android a criarem aplicações com maior qualidade!

Slide 11

Slide 11 text

Android KTX AppCompat Auto Benchmark Multidex Security Test TV Wear OS by Google Data Binding Lifecycles LiveData Navigation Paging Room ViewModel WorkManager CameraX Download Manager Media & Playback Notifications Multidex Permissions Preferences Sharing Slices Animation & transitions Emoji Fragment Layout Palette ViewPager2 Compose ConstraintLayout 2.0 Biometrics

Slide 12

Slide 12 text

Android KTX AppCompat Auto Benchmark Multidex Security Test TV Wear OS by Google Data Binding Lifecycles LiveData Navigation Paging Room ViewModel WorkManager CameraX Download Manager Media & Playback Notifications Multidex Permissions Preferences Sharing Slices Animation & transitions Emoji Fragment Layout Palette ViewPager2 Compose Base Arquitetura Comportamento UI ConstraintLayout 2.0 Biometrics

Slide 13

Slide 13 text

Android KTX AppCompat Auto Benchmark Multidex Security Test TV Wear OS by Google Data Binding Lifecycles LiveData Navigation Paging Room ViewModel WorkManager CameraX Download Manager Media & Playback Notifications Multidex Permissions Preferences Sharing Slices Animation & transitions Emoji Fragment Layout Palette ViewPager2 Compose Base Arquitetura Comportamento UI AndroidX ConstraintLayout 2.0 Biometrics

Slide 14

Slide 14 text

O Jetpack foi anunciado há 1 ano lá no Google I/O ’18, e desde então o Google vem trabalhado em uma série de boas novidades para esse conjunto, sempre trabalhando bem próximo de empresas e da comunidade. ❤✨

Slide 15

Slide 15 text

Fonte: Android Developers (YouTube)

Slide 16

Slide 16 text

De acordo com o Google, 80% dos top 1.000 apps no Google Play já estão usando Jetpack, o que é um número bem impressionante e mostra o impacto do projeto na comunidade Android em geral! Fonte: bit.do/whats-new-jetpack

Slide 17

Slide 17 text

Fonte: Android Developers, 2019

Slide 18

Slide 18 text

Infelizmente hoje não vou conseguir me aprofundar sobre todas as bibliotecas e APIs que o Jetpack tem, pois é muito conteúdo para pouco tempo! 
 Mas já existe uma série de materiais legais sobre o assunto, principalmente por parte do Google!

Slide 19

Slide 19 text

Android Jetpack - Site Documentação oficial e mais detalhes sobre o Jetpack developers.android.com/jetpack

Slide 20

Slide 20 text

Android Jetpack - YouTube Lista de vídeos com vários talks sobre as APIs do Jetpack bit.do/android-jetpack-youtube

Slide 21

Slide 21 text

Bacana! E o que temos de novidades no Jetpack desde o seu lançamento?

Slide 22

Slide 22 text

Novidades do Android Jetpack! O que temos de legal?

Slide 23

Slide 23 text

Vamos dar uma olhada naquela lista de APIs e bibliotecas novamente?

Slide 24

Slide 24 text

Android KTX AppCompat Auto Benchmark Multidex Security Test TV Wear OS by Google Data Binding Lifecycles LiveData Navigation Paging Room ViewModel WorkManager CameraX Download Manager Media & Playback Notifications Multidex Permissions Preferences Sharing Slices Animation & transitions Emoji Fragment Layout Palette ViewPager2 Compose Base Arquitetura Comportamento UI AndroidX ConstraintLayout 2.0 Biometrics

Slide 25

Slide 25 text

Android KTX AppCompat Auto ⚠ Benchmark ⚠ Multidex Security ⚠ Test TV Wear OS by Google Data Binding Lifecycles ⚠ LiveData ⚠ Navigation ✅ Paging Room ViewModel ⚠ WorkManager ✅ CameraX ⚠ Download Manager Media & Playback Notifications Multidex Permissions Preferences Sharing Slices Animation & transitions Emoji Fragment Layout Palette ViewPager2 ⚠ Compose ⚠ Base Arquitetura Comportamento UI AndroidX ConstraintLayout 2.0 ⚠ Biometrics ⚠

Slide 26

Slide 26 text

Bastante coisa nova! Vale lembrar que grande parte das novidades ainda se encontra em estágios de desenvolvimento alpha e beta! ⚠
 
 Vamos dar uma olhada:

Slide 27

Slide 27 text

LiveData e Lifecycles + Coroutines (alpha) ⚠ class MyViewModel: ViewModel() { init { viewModelScope.launch { // Coroutine that will be canceled // when the ViewModel is cleared. } } }

Slide 28

Slide 28 text

LiveData e Lifecycles + Coroutines (alpha) ⚠ class MyFragment: Fragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) viewLifecycleOwner.lifecycleScope.launch { val params = TextViewCompat.getTextMetricsParams(textView) val precomputedText = withContext(Dispatchers.Default) { PrecomputedTextCompat.create(longTextContent, params) } TextViewCompat.setPrecomputedText(textView, precomputedText) } } }

Slide 29

Slide 29 text

LiveData e Lifecycles + Coroutines (alpha) ⚠ val user: LiveData = liveData { val data = database.loadUser() // loadUser is a suspend function. emit(data) }

Slide 30

Slide 30 text

LiveData e Lifecycles + Coroutines (alpha) ⚠ val user: LiveData = liveData { emit(Result.loading()) try { emit(Result.success(fetchUser()) } catch(ioException: Exception) { emit(Result.error(ioException)) } }

Slide 31

Slide 31 text

LiveData e Lifecycles + Coroutines (alpha) ⚠ class MyViewModel: ViewModel() { private val userId: LiveData = MutableLiveData() val user = userId.switchMap { id -> liveData(context = viewModelScope.coroutineContext + Dispatchers.IO) { emit(database.loadUserById(id)) } } }

Slide 32

Slide 32 text

LiveData e Lifecycles + Coroutines (alpha) ⚠ class UserDao: Dao { @Query("SELECT * FROM User WHERE id = :id") fun getUser(id: String): LiveData } class MyRepository { fun getUser(id: String) = liveData { val disposable = emitSource( userDao.getUser(id).map { Result.loading(it) } ) // Fetch user, save, etc } }

Slide 33

Slide 33 text

dependencies { androidTestImplementation "androidx.benchmark:benchmark-junit4:1.0.0-alpha04" } Benchmark (alpha) ⚠ module/build.gradle

Slide 34

Slide 34 text

Benchmark (alpha) ⚠ module/src/androidTest/AndroidManifest.xml

Slide 35

Slide 35 text

@RunWith(AndroidJUnit4::class) class MyBenchmark { @get:Rule val benchmarkRule = BenchmarkRule() @Test fun benchmarkSomeWork() = benchmarkRule.measureRepeated { doSomeWork() } } Benchmark (alpha) ⚠ module/src/androidTest/java//MyBenchmark.kt

Slide 36

Slide 36 text

// Optional, but highly recommended values val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec) Security (alpha) ⚠

Slide 37

Slide 37 text

val fileToRead = "my_sensitive_data.txt" lateinit var byteStream: ByteArrayOutputStream val encryptedFile = EncryptedFile.Builder( File(context.getFilesDir(), fileToRead), context, masterKeyAlias, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build() Security (alpha) ⚠

Slide 38

Slide 38 text

try { encryptedFile.openFileInput().use { fileInputStream -> try { byteStream = ByteArrayOutputStream() var nextByte = fileInputStream.read() while (nextByte != -1) { byteStream.write(nextByte) nextByte = fileInputStream.read() } val fileContents = byteStream.toByteArray() } catch (ex: Exception) { // Error occurred opening raw file for reading. } finally { fileInputStream.close() } }) } catch (ex: IOException) { // Error occurred opening encrypted file for reading. } Security (alpha) ⚠

Slide 39

Slide 39 text

val fileToWrite = "my_other_sensitive_data.txt" val encryptedFile = EncryptedFile.Builder( File(context.getFilesDir(), fileToWrite), context, masterKeyAlias, EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB ).build() // Write to a file. try { val outputStream: FileOutputStream? = encryptedFile.openFileOutput() outputStream?.apply { write("MY SUPER SECRET INFORMATION" .toByteArray(Charset.forName("UTF-8"))) flush() close() } } catch (exception: IOException) { // Error occurred opening file for writing. } Security (alpha) ⚠

Slide 40

Slide 40 text

val sharedPreferences = EncryptedSharedPreferences .create( fileName, masterKeyAlias, context, EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV, EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM ) val sharedPrefsEditor = sharedPreferences.edit() Security (alpha) ⚠

Slide 41

Slide 41 text

// Setup a SavedStateHandle on a ViewModel val vm = ViewModelProvider(this, SavedStateVMFactory(this)) .get(SavedStateViewModel::class.java) // Adding the SavedStateHandle on ViewModel constructor class SavedStateViewModel(private val state: SavedStateHandle) : ViewModel() { ... } ViewModel com SavedState (alpha) ⚠

Slide 42

Slide 42 text

// A classe SavedStateHandle tem métodos helpers // que ajudam a lidar com o map de chave-valor: // // - get(String key) // - contains(String key) // - remove(String key) // - set(String key, T value) // - keys() ViewModel com SavedState (alpha) ⚠

Slide 43

Slide 43 text

Biometrics (beta) ⚠

Slide 44

Slide 44 text

dependencies { implementation 'androidx.biometric:biometric:1.0.0-alpha04' } Biometrics (alpha) ⚠ module/build.gradle

Slide 45

Slide 45 text

private val executor = Executor { } override fun onCreate(savedInstanceState: Bundle?) { // Prompt appears when user clicks "Log in" val biometricLoginButton = findViewById(R.id.biometric_login) biometricLoginButton.setOnClickListener { showBiometricPrompt() } } Biometrics (alpha) ⚠

Slide 46

Slide 46 text

val promptInfo = BiometricPrompt.PromptInfo.Builder() .setTitle("Biometric login for my app") .setSubtitle("Log in using your biometric credential") .setNegativeButtonText("Cancel") .build() Biometrics (alpha) ⚠

Slide 47

Slide 47 text

val biometricPrompt = BiometricPrompt(this, executor, object : BiometricPrompt.AuthenticationCallback() { 
 override fun onAuthenticationError(errorCode: Int, errorMessage: CharSequence) { super.onAuthenticationError(errorCode, errorMessage) 
 Toast.makeText(context, "Authentication error: $errorMessage", Toast.LENGTH_SHORT) .show() }
 … Biometrics (alpha) ⚠

Slide 48

Slide 48 text

… override fun onAuthenticationSucceeded(result:BiometricPrompt.AuthenticationResult) { super.onAuthenticationSucceeded(result) val authenticatedCryptoObject: BiometricPrompt.CryptoObject = result.getCryptoObject() } override fun onAuthenticationFailed() { super.onAuthenticationFailed() 
 Toast.makeText(context, "Authentication failed”, Toast.LENGTH_SHORT).show() } biometricPrompt.authenticate(promptInfo) Biometrics (alpha) ⚠

Slide 49

Slide 49 text

Bônus demo: Jetpack Compose Criando UIs de forma declarativa! ⚠

Slide 50

Slide 50 text

Se eu quiser aprender mais, onde eu posso encontrar material?

Slide 51

Slide 51 text

Android Jetpack - Site Documentação oficial e mais detalhes sobre o Jetpack developers.android.com/jetpack

Slide 52

Slide 52 text

Android Jetpack - YouTube Lista de vídeos com vários talks sobre as APIs do Jetpack bit.do/android-jetpack-youtube

Slide 53

Slide 53 text

Android Dev BR Maior comunidade lusófona de Android no Slack, com quase de 6.000 membros! /❤✨ slack.androiddevbr.org

Slide 54

Slide 54 text

Perguntas? Ficou alguma dúvida?

Slide 55

Slide 55 text

Muito obrigado! Se tiver qualquer dúvida ou sugestão, pode falar comigo. ❤ @walmyrcarvalho /walmyrcarvalho walmyr@kusudama.com.br