Mobile Development Workshop with GoJek Academy

BNCC x Go-Academy 2020: Introduce & Dive into Kotlin in Android Development

BNCC x Go-Academy: “Android Development with Kotlin”. Ayo bikin App Android kamu dengan next-generation programming language, Kotlin!

Akmal Rusli
8 min readSep 17, 2020
Android ♥ Kotlin (Sumber istimewa)

Selamat datang di story Medium pertamaku! Barangkali saya juga sudah menuliskan post ini di blog pribadi saya sebelumnya (simak di blog post pribadi saya). Sebelumnya, perkenalkan nama saya Akmal (gak pakai nama belakang karena nama belakangku tidak ada dalam KTP saya, kecuali sebagai pembeda karena ditakutkan sulit dibedakan dengan nama-nama saya yang lain), saya seorang BINUSIAN 2022 di jurusan Computer Science & kini sedang menempuh semester 5 (pada post ini diterbitkan) yang sayangnya harus menjalankan perkuliahan secara daring dari rumah karena (sudah pasti) pandemi COVID-19.

BNCC x Go-Academy

Pada tahun 2020, BNCC kembali mengadakan BNCC Academy Bootcamp bersama Go-Academy dimana pada tahun ini, BNCC Academy mengangkat tema “Android Development with Kotlin” dimana pada pengembangan aplikasi Android pada saat ini mayoritas sudah beralih ke bahasa pemrograman Kotlin. Pada tahun ini, seluruh kegiatannya diadakan secara daring karena adanya pandemi COVID-19 dan PSBB DKI yang tentunya menghambat upaya pembelajaran on-site.

Mengenal Kotlin

Kotlin Programming Language

Buat yang belum familiar dengan Kotlin, Kotlin sendiri adalah bahasa pemrograman yang berbasiskan bahasa pemrograman Java & dikembangkan oleh JetBrains dimana dapat dijalankan pada sistem JVM (Java Virtual Machine) dan dapat inter-operable dengan code Java sehingga mudah untuk diaplikasikan meski dengan campur aduk dengan code Java Anda.

Kotlin sendiri juga bisa anda aplikasikan dalam project anda tidak hanya melalui Android Studio, namun juga pada setiap IDE yang berbasiskan IntelliJ IDEA yang support Kotlin dan juga pada IDE kesayangan anda melalui plugin Kotlin sesuai dengan marketplacenya masing-masing.

Apa bedanya dengan Java?

Jawabannya hampir mirip namun ada beberapa hal yang tentunya bisa mempermudah kamu dalam mengembangkan software yaitu:

  1. Tanpa titik koma (;) pada setiap akhir statement
  2. Null safety (Safety call [?.], [?] for nullable, dan [!!.] for non-null assertion)
  3. Penggunaan var dan val sebagai variabel bebas (tanpa harus mendefinisikan object class)
  4. Smart casts (menggunakan as sebagai cast)
  5. Static members digantikan dengan companion objects, top-level functions, extension functions
  6. Extension functions (penerusan function dari class objects)
  7. Dan lain sebagainya.. (simak di sini)

Contoh Syntax Kotlin paling dasar:

fun hitungDuaAngka(angka1: Int, angka2: Int): Int {
return angka1 + angka2
}
// atau dipersingkat menjadi:
fun hitungDuaAngka(angka1: Int, angka2: Int): Int = angka1 + angka2

Jika anda ingin mencoba bereksperimen dengan code-code Kotlin, bisa kalian akses melalui Kotlin Koans di bawah:

Atau jika anda ingin bersenang-senang melakukan coding Kotlin sesuka hati dimana saja melalui Kotlin Playground di bawah:

The Activity Lifecycle

Android Activity Lifecycle

Dalam aplikasi Android, terdapat lifecycle yang berperan penting dalam berjalannya sebuah Activity. Activity juga tentunya mempunyai koneksi ke activity lain melalui Intent. Apa bedanya Activity dan Intent?

Activity sendiri merujuk pada laman yang kita rancang & tampilkan pada layar smartphone sedangkan Intent merupakan fasilitas yang diinginkan oleh Activity (baik berpindah laman/Activity maupun menerima panggilan dari aplikasi lain).

Intent berfungsi dalam perpindahan Activity juga untuk menerima panggilan dari aplikasi lain (misalnya share, bayar pakai QR Code, upload file) dan Launcher.

Dalam project yang saya buat, saya sertakan salah satu demo code yang dapat kalian akses melalui repository saya di sini.

The sample Activity code with Intent

Intent tentunya bisa bikin aplikasi anda bisa diakses oleh aplikasi lain dan memungkinkan anda untuk mempunyai 2 launcher untuk activity berbeda lho! Caranya? Tentu dengan intent-filter, anda dapat menerima panggilan intent apapun bahkan termasuk juga dari launcher dan panggilan dari aplikasi lainnya.

Multiple launcher icon with intent-filter

Tanpa adanya intent-filter sama sekali dalam AndroidManifest.xml, aplikasi tentunya tidak bisa dibuka karena tidak ada intent yang menerima akses tersebut sama sekali.

Untuk mengetahui informasi lebih lanjut mengenai Intent & Intent Filter dapat dilihat melalui link di bawah:

A view for your data: RecyclerView

Bagi developer barbar, menampilkan data perlu berulangkali copy-paste layout yang sama untuk menampilkan data yang berbeda-beda. HAH? kalo datanya sampai ribuan apa kagak mampus?

Ada sebuah View yang sangat sakti dalam menampilkan data-data baik data yang kita buat sendiri maupun data yang diambil dari sumber luar, yaitu RecyclerView!

Mengapa RecyclerView? Karena RecyclerView mempadukan satu elemen layout untuk kemudian dipakai berulang-ulang jika ada pemakaian elemen yang berulang-ulang, terutama jika ada perubahan data.

Layers of RecyclerView

Dalam ReyclerView terdapat 2 komponen penting, yaitu RecyclerView.Adapter dan RecyclerView.ViewHolder dimana:

  • RecyclerView.Adapter berfungsi untuk menampung data-data yang anda inginkan ke dalam layout tersebut (data pools).
  • RecyclerView.ViewHolder untuk melakukan bind data-data dalam Adapter ke RecyclerView itu sendiri (binder).

Tentunya View tersebut sangat amat berguna jika anda menginginkan data yang banyak & berseri untuk ditampilkan dalam View tersebut.

Ingin mengetahui lebih lanjut tentang RecyclerView? Simak lebih lanjut via link di bawah:

Hit your data with OkHttp!

Click website vector created by rawpixel.com — www.freepik.com [Source]

Untuk project yang saya buat, saya menggunakan okHttp sebagai library dalam menjalankan hit API untuk mendapatkan data yang saya butuhkan. Ada berbagai pilihan alternatif lain seperti retrofit untuk mendapatkan API dengan bantuan GSON/library JSON lainnya.

Untuk memasukkan library tersebut (baik okHttp maupun retrofit), library tersebut wajib dimasukkan ke dalam build.gradle dan lakukan “sync project” agar library dapat tersinkronisasi dengan project tersebut.

dependencies {
...
// for image insertion, use Picasso library
implementation 'com.squareup.picasso:picasso:2.71828'
// Use okHttp library
implementation "com.squareup.okhttp3:okhttp:4.8.1"
// or if you using retrofit library
implementation 'com.squareup.retrofit2:retrofit:2.8.0'
}

Dalam Hit API menggunakan okHttp, terdapat 2 function penting yaitu fetchData(lookupAdapter: LookupAdapter) dan getCallback(lookupAdapter: LookupAdapter): Callback dimana kedua function tersebut tidak ada dalam library & tidak harus didefinisikan, namun masing-masing mempunyai peranan masing-masing.

Function fetchData akan memanggil request sesuai dengan URL API yang diinginkan oleh pengguna lalu melakukan enqueue untuk mendapatkan data-data dari API dengan memanggil function getCallback di dalamnya.

val request: Request = Request.Builder().url(dataApiURL).build()okHttpClient.newCall(request).enqueue(getCallback(lookupAdapter))

Dalam function getCallback yang terpanggil oleh okHttpClient, data akan diambil sebagai JSON (JavaScript Object Notation) untuk kemudian diubah sebagai array oleh JSONArray untuk kemudian kita olah sendiri datanya menjadi data-class object.

Barangkali code seperti ini terlihat cukup panjang bagi sebagian developer sehingga terkadang dalam kasus tertentu, developer merasa perlu ada beberapa bagian code yang harus diubah dengan alasan yang berbeda (why? Jawabannya ada di smell Divergent Change (Martin Fowler)) sehingga perlu diubah dengan menerapkan building block salah satunya adalah MVP (Model-View-Presenter).

Architectural Takeaway: Model-View-Presenter Building Block

“Poorly designed code usually takes more code to do the same things, often because the code quite literally does the same thing in several places.”
― Martin Fowler

Pada bagian code diatas, barangkali cukup memusingkan apalagi disertai dengan alasan efisiensi waktu, code tersebut diselesaikan dengan teknik ‘hajar’ bagian code tanpa peduli building block apa yang mau diterapkan pada data fetching from API tersebut.

Domain conceptual levels at stance [Source]

Dalam Software Engineering, diperkenalkan Design Pattern, Domain Design, dan Building Block dimana ketiga elemen tersebut dapat membantu para developer menciptakan software dengan rapi, jelas, dan mudah dipahami oleh pengguna maupun developer lain.

Pada dasar dalam penerapan Domain Design, Aplikasi terbagikan dalam 6 Level yaitu:

  • View
  • Controller
  • Handler
  • Repository
  • Factory
  • Model

Atau jika dipersingkat dan disederhanakan:

  • View (the user interface)
  • Controller (connector between View and Model)
  • Repository (user-defined data storage)
  • Model (the data fetched from database/online sources)

Terdapat beberapa building block untuk mempermudah integrasi aplikasi antara View, Controller, dan Repository yaitu melalui:

  • MVC (Model-View-Controller)
  • MVP (Model-View-Presenter)
  • MVVM (Model-View-ViewModel)
MVC vs MVP, the two of most common building block in Android Architecture

Pada project yang saya kerjakan, saya menerapkan model arsitektur MVP (Model-View-Presenter) yang diajarkan oleh Raditya Gumay dan Egi Adtya dalam kegiatan BNCC Academy hari ke-5.

Untuk menyederhanakan permodelan tersebut, terdapat 4 langkah dalam pemisahan layer dalam sebuah activity, yaitu:

  1. Buatkan 2 class, representatif untuk pisahin layer View dari business logic & data processing logic (Presenter & Model).
  2. Definisikan 3 interface representasi MVP building block yaitu, Presenter dengan parameter Model dan View, Model dengan parameter Callback, serta View untuk diimplementasikan pada masing-masing representasi layernya.
  3. Pisahkan fetchData ke Model class (anggap nama barunya getData dengan return value berupa Callback) & getCallback ke Presenter class.
  4. Pastikan dalam View/Activity telah mengimplementasikan building block View agar mudah dipanggil oleh class lain.

Maka hasilnya akan semakin mempermudah anda dalam memahami isi code tersebut lebih mudah dengan penerapan building block!

Kepanjangan? Terlalu ribet dengan panjangnya code yang aku buat? Atau penasaran ingin mencoba mengaplikasikan building block ke project aplikasi Android-mu dengan inovasi anda masing-masing? Ketiga bagian code tersebut merupakan contoh penerapan MVP dan okHttp yang diaplikasikan dalam Project Siaga COVID-19 yang dikerjakan secara personal dan perkelompokan selama BNCC x GoAcademy berlangsung.

Sebagai referensi, saya juga menyertakan building block agar teman-teman dapat mengimplementasikan building block ini dengan mudah dan cepat dalam penerapan MPV architecture.

What’s next in Kotlin Development?

Dalam development aplikasi Android berbasis Kotlin, sudah banyak developer yang memanfaatkan Kotlin sebagai preferred programming language-nya salah satunya Gojek, DANA, hingga Google dengan masing-masing inovasi yang super duper inovatif.

Kotlin development in Gojek (visit Gojek blog at https://blog.gojekengineering.com/tagged/kotlin)

Dalam beberapa produk Google, terdapat aplikasi yang memanfaatkan RecyclerView ini dengan tingkat kompleksitas yang cukup tinggi. Bahkan dalam RecyclerView terdapat informasi-informasi yang padat dan beragam mengenai aktivitas yang ingin anda ikuti tentunya.

Google Calendar in Android [Source: Nokia Power User]

Dan buat anda yang ingin belajar lebih lanjut mengenai API dalam pemrograman Android, silahkan disimak pada link di bawah:

Satu lagi, saya juga sertakan link repository yang tentunya sangat disayangkan jika anda tidak mencoba Aplikasi hasil eksperimen saya sendiri dengan Project COVID-19 Data selama BNCC x Go-Academy berlangsung:

Sekian post pertama di Medium, semoga bermanfaat untuk kita semua 😃

--

--

Akmal Rusli
0 Followers

BINUSIAN 2022 Computer Scientist — Software Engineering, Java Developer, New Android ft. Kotlin Developer