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

Living on a green rocket field - GDG Berlin Android meetup

Hasan Hosgel
September 26, 2018

Living on a green rocket field - GDG Berlin Android meetup

At Google IO 2018 the Android team announced Jetpack for Android, which is an opinionated set of libraries and architecture, which is a recommendation for Android developers. We wanted to share our experience with Jetpack and also give some recommendations for all the library & SDK developers.

Hasan Hosgel

September 26, 2018
Tweet

More Decks by Hasan Hosgel

Other Decks in Technology

Transcript

  1. @alosdev GDG Berlin Android 09
    Living on a green rocket
    field
    Hasan Hosgel
    alpha

    View Slide

  2. @alosdev GDG Berlin Android 09
    The King is dead - long live the king

    View Slide

  3. @alosdev GDG Berlin Android 09
    History

    View Slide

  4. @alosdev GDG Berlin Android 09
    Timetable
    2011/03 - 1st version Support Library - ActionBarSherlock
    2012/03 - Notification Compat
    2013/07 - App Compat, Media Router
    2014/10 - RecyclerView, CardView
    2015/08 - bunch of new libraries
    2016/08 - split support libs
    2017/06 - multidex

    source: https://developer.android.com/topic/libraries/support-library/revisions

    View Slide

  5. @alosdev GDG Berlin Android 09
    What now?

    View Slide

  6. @alosdev GDG Berlin Android 09
    Welcome Jetpack

    View Slide

  7. @alosdev GDG Berlin Android 09
    android.support.v4.***
    ->
    androidx.***
    Except
    com.google.android.material.***

    View Slide

  8. @alosdev GDG Berlin Android 09
    gradle.properties
    android.useAndroidX = true
    android.enableJetifier = true

    View Slide

  9. @alosdev GDG Berlin Android 09
    Jetpack components
    ● Foundation
    ● Architecture
    ● Behaviour
    ● UI

    View Slide

  10. @alosdev GDG Berlin Android 09
    Foundation libraries
    ● AppCompat
    ● Android KTX
    ● MultiDex
    ● Test
    NEW

    View Slide

  11. @alosdev GDG Berlin Android 09
    Android KTX
    Kotlin Extension for a bunch of jetpack libraries:
    ● Core-ktx
    ● Fragment-ktx
    ● Lifecycle-ktx
    ● navigation-ktx

    View Slide

  12. @alosdev GDG Berlin Android 09
    Architecture libraries
    ● DataBinding
    ● Lifecycles
    ● LiveData
    ● Navigation
    ● Paging
    ● Room
    ● ViewModel
    ● WorkManager
    NEW
    NEW
    NEW

    View Slide

  13. @alosdev GDG Berlin Android 09
    Navigation
    ● Navigation Controller
    ● “easily” update in a wysiwyg editor, also via xml
    ● new resource type navigation

    View Slide

  14. @alosdev GDG Berlin Android 09
    Navigation graph
    app:startDestination="@id/blankFragment">
    android:id="@+id/blankFragment"
    android:name="com.example.cashdog.cashdog.BlankFragment"
    android:label="fragment_blank"
    tools:layout="@layout/fragment_blank" />
    android:id="@+id/blankFragment2"
    android:name="com.example.cashdog.cashdog.BlankFragment2"
    android:label="Blank2"
    tools:layout="@layout/fragment_blank_fragment2" />

    View Slide

  15. @alosdev GDG Berlin Android 09
    Layout file
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/my_nav_host_fragment"
    android:name="androidx.navigation.fragment.NavHostFragment"
    app:navGraph="@navigation/nav_graph"
    app:defaultNavHost="true"/>

    View Slide

  16. @alosdev GDG Berlin Android 09
    Using NavigationController
    view.findNavController().navigate(R.id.viewTransactionsAction)
    button.setOnClickListener(Navigation.createNavigateOnClickListener(R.id.next_fragment, null))
    val navigationView = findViewById(R.id.nav_view)
    navigationView.setupWithNavController(navController)

    View Slide

  17. @alosdev GDG Berlin Android 09
    Parameterized navigation
    android:id="@+id/confirmationFragment"
    android:name="com.example.cashdog.cashdog.ConfirmationFragment"
    android:label="fragment_confirmation"
    tools:layout="@layout/fragment_confirmation">

    var bundle = bundleOf("amount" to amount)
    view.findNavController().navigate(R.id.confirmationAction, bundle)

    View Slide

  18. @alosdev GDG Berlin Android 09
    Parameterized navigation with TypeSafety
    Build.gradle:

    apply plugin: 'androidx.navigation.safeargs'

    Caller side:
    val action = SpecifyAmountFragmentDirections.confirmationAction(amount)
    action.amount = amount
    v.findNavController().navigate(action)
    Consumer side:
    ConfirmationFragmentArgs.fromBundle(arguments).amount

    View Slide

  19. @alosdev GDG Berlin Android 09
    Navigation in Multi Modules
    ● Include existing navigation graph
    ● Module dependency on the navigation
    graph you want to use
    ● If you don’t want to depend on the other
    module, define the resource id in the base
    ○ no TypeSafety

    View Slide

  20. @alosdev GDG Berlin Android 09
    Paging
    ● PagedList as data object
    ● DataSource to serve PageList
    ● PagedListAdapter for RecyclerView
    Attention: if you want to manipulate the List itself that is not the way to go

    View Slide

  21. @alosdev GDG Berlin Android 09
    WorkManager
    ● Successor of JobScheduler, JobDispatcher & AlarmManager
    ● Not depending on Google play services (GMS)
    ○ Usage outside of Google ecosystem
    ● Defining constraints, when to run them ( charging, network, etc.)

    View Slide

  22. @alosdev GDG Berlin Android 09
    Worker
    class CompressWorker(context : Context, params : WorkerParameters)
    : Worker(context, params) {
    override fun doWork(): Result {
    // Do the work here--in this case, compress the stored images.
    // In this example no parameters are passed; the task is
    // assumed to be "compress the whole library."
    myCompress()
    // Indicate success or failure with your return value:
    return Result.SUCCESS
    // (Returning RETRY tells WorkManager to try this task again
    // later; FAILURE says not to try again.)
    }
    }

    View Slide

  23. @alosdev GDG Berlin Android 09
    Constraint
    // Create a Constraints object that defines when the task should run
    val myConstraints = Constraints.Builder()
    .setRequiresDeviceIdle(true)
    .setRequiresCharging(true)
    // Many other constraints are available, see the
    // Constraints.Builder reference
    .build()

    View Slide

  24. @alosdev GDG Berlin Android 09
    Running them
    // ...then create a OneTimeWorkRequest that uses those constraints
    val compressionWork = OneTimeWorkRequestBuilder()
    .setConstraints(myConstraints)
    .build()
    OR
    val compressionWork =
    PeriodicWorkRequestBuilder(12, TimeUnit.HOURS)
    .setConstraints(myConstraints)
    .build()
    // Then enqueue the recurring task:
    WorkManager.getInstance().enqueue(compressionWork)

    View Slide

  25. @alosdev GDG Berlin Android 09
    Worker chains
    val chain1 = WorkManager.getInstance()
    .beginWith(workA)
    .then(workB)
    val chain2 = WorkManager.getInstance()
    .beginWith(workC)
    .then(workD)
    val chain3 = WorkContinuation
    .combine(chain1, chain2)
    .then(workE)
    chain3.enqueue()

    View Slide

  26. @alosdev GDG Berlin Android 09
    Behaviour libraries
    ● Download Manager
    ● Media & Playback
    ● Notifications
    ● Permission
    ● Sharing
    ● Slices NEW

    View Slide

  27. @alosdev GDG Berlin Android 09
    Slices
    ● Currently not visible for users, but you can be first movers
    ● Like widgets for the home screen, just in other apps
    ● Supported API level 19 (KitKat) onwards
    ● Can be used with Actions

    View Slide

  28. @alosdev GDG Berlin Android 09
    UI libraries
    ● Animation & transitions
    ● Auto
    ● Emoji
    ● Fragment
    ● Layout
    ● Palette
    ● TV
    ● Wear OS by Google

    View Slide

  29. @alosdev GDG Berlin Android 09
    Jetpack - sample app
    https://github.com/googlesamples/android-sunflower

    View Slide

  30. @alosdev GDG Berlin Android 09
    Wishlist for libraries/ SDKs
    ● Don’t force your user to a specific marshaller (GSON, Jackson, Moshi)
    ○ Offer the functionality like Retrofit and the ConverterFactory
    ● Don’t force your user to use Rx- there is a cool guy around => Coroutine
    ○ Droidcon Panel discussion “Rx must die!?”
    ○ From Rx monolith to Coroutines + multi modules
    by Ivan Morgillo
    ● Don’t depend on bigger libraries, especially if just use a small part of it
    ● Add proguard config in your Jar/ Aar and don’t widen it to much

    View Slide

  31. @alosdev GDG Berlin Android 09
    Any Questions

    View Slide