Android ♥ Kotlin (Sumber istimewa) Android ♥ Kotlin (Sumber istimewa)

Hai wahai para pembaca blog! Hari ini aku kembali menuliskan blog ini untuk kegiatan saya selama liburan semester pendekku. Sebelumnya saat ini saya 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

Sedikit bocoran buat anda yang penasaran & ingin mencerna sebaik mungkin dengan bacaan favorit kalian lainnya di Medium, ayo simak story yang telah saya buat bersamaan pada pertemuan ke-6 BNCC x Go-Academy di sini!

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 (di tempat).

Mengenal Kotlin

Kotlin Programming Language 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 sini.

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

The Activity Lifecycle

Android Activity Lifecycle Android 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

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.

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 di Android UI Guides - Intents & Intent Filters di bawah:

Intents and Intent Filters  |  Android Developers

An Intent is a messaging object you can use to request an action from another app component . Although intents facilitate communication between components in several ways, there are three fundamental use cases: An Activity represents a single screen in…

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 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 melalui Android Developer UI Guides - RecyclerView di bawah:

Create a List with RecyclerView  |  Android Developers

Using RecyclerView to display lists and grids of dynamic content.

Hit your data with OkHttp!

Click website vector 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 lookupDataApiURL = "https://api.kawalcorona.com/indonesia/provinsi/"
val request: Request = Request.Builder().url(lookupDataApiURL).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 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 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 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 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 di bawah:

akmalrusli363/BNCC-Academy-Kotlin-Demo

A repository for an app made during BNCC x Gojek Academy demonstrated using Kotlin, which shows data about COVID19 statistics in Indonesia - akmalrusli363/BNCC-Academy-Kotlin-Demo

Sekian post saya mengenai kegiatan saya di BNCC x Go-Academy, semoga bermanfaat bagi kita semua & sampai ketemu di post selanjutnya :smiley: