Belajar Membuat Aplikasi Android Studi Kasus Proyek Akademi
1. Proyek Academy - View Model
2. Proyek Academy - Repository dan Injection
3. Proyek Academy - LiveData
4. Proyek Academy - Idling Resource
5. Proyek Academy - Room
6. Proyek Academy - Pagination
Tujuan
Pada Kelas Jetpack, akan ada latihan membuat Aplikasi Academy menggunakan berbagai komponen Android Jetpack yang dibagi berdasarkan materi tiap modulnya. Oleh karena itu, pada modul ini Anda akan mempersiapkan segala asset yang akan digunakan, seperti layout, gambar, warna dan resource lainnya. Ini semua akan mempermudah pembuatan Aplikasi Academy.
Codelab Persiapan Project
Anda dapat melewati codelab ini sampai "Persiapan Menghubungkan Activity dan Fragment" dengan mengunduh project starter melalui link di bawah ini:
Anda juga dapat mengikuti langkah-langkah di bawah ini jika ingin membuat project dari awal:
- Buat proyek baru di Android Studio dengan kriteria sebagai berikut :
Nama Project Academy Target & Minimum Target SDK Phone and Tablet, API Level 21 Tipe Activity Empty Activity Activity Name MainActivity - Selanjutnya ubah MainActivity menjadi HomeActivity dengan cara klik kanan di MainActivity → Refactor → Rename.
Ubah juga layout-nya dari activity_main.xml menjadi activity_home.xml dengan cara klik kanan di activity_main → Refactor → Rename. - Selanjutnya, buka build.gradle level project dan tambahkan versi untuk library berikut:
Versi-versi di atas kita gunakan untuk mempermudah pemeliharan library yang Anda gunakan. Setelah itu, buka build.gradle level module: app dan tambahkan library-library berikut:Kotlin ext {
//dependencies version
appCompatVersion = '1.1.0'
coreVersion = '1.1.0'
constraintLayoutVersion = '1.1.3'
junitVersion = '4.12'
espressoVersion = '3.1.0'
archLifecycleVersion = '2.1.0'
materialVersion = '1.0.0'
recyclerViewVersion = '1.1.0'
glideVersion = '4.10.0'
}Java ext {
//dependencies version
appCompatVersion = '1.1.0'
constraintLayoutVersion = '1.1.3'
junitVersion = '4.12'
espressoVersion = '3.1.0'
archLifecycleVersion = '2.1.0'
materialVersion = '1.0.0'
recyclerViewVersion = '1.1.0'
glideVersion = '4.10.0'
}
Library-library di atas akan digunakan selama pembuatan aplikasi Academy. Jika dilihat, library di atas jadi lebih mudah dilihat dan dipelihara. Jika biasanya Anda memanggil sebuah library ke dalam proyek Android, kini Anda menuliskan beserta versinya, contohnya ketika Anda membutuhkan librarytesting seperti ini:Kotlin dependencies {
//kotlin
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "androidx.core:core-ktx:$coreVersion"
//ui
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "androidx.appcompat:appcompat:$appCompatVersion"
implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion"
implementation "androidx.recyclerview:recyclerview:$recyclerViewVersion"
implementation "com.google.android.material:material:$materialVersion"
implementation "com.github.bumptech.glide:glide:$glideVersion"
//testing
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
}Java dependencies {
//ui
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation "androidx.appcompat:appcompat:$appCompatVersion"
implementation "androidx.constraintlayout:constraintlayout:$constraintLayoutVersion"
implementation "androidx.recyclerview:recyclerview:$recyclerViewVersion"
implementation "com.google.android.material:material:$materialVersion"
implementation "com.github.bumptech.glide:glide:$glideVersion"
//testing
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$espressoVersion"
}testImplementation "junit:junit:4.12"
Jika library mengalami update, maka Anda perlu meng-update ke versi terbaru dan mengubah versi library satu-satu. Dengan memisahkan versi library, Anda akan dimudahkan ketika terjadi perubahan versi library.
androidTestImplementation "junit:junit:4.12" - Aktifkan Java 8 Lambda Expressions pada proyek dengan cara menambahkan kode berikut di build.gradle (module:app).
android {
...
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
} - Aktifkan juga vectorDrawable pada proyek dengan cara menambahkan kode berikut di build.gradle (module:app).
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.dicoding.academies"
minSdkVersion 17
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
vectorDrawables.useSupportLibrary = true
} - Setelah menambahkan library, tambahkan Activity dengan tipe Empty Activity dan berilah nama CourseReaderActivity.
- Buatlah sebuah Activity lagi namun dengan tipe Basic Activity dan beri nama DetailCourseActivity. Ubah title-nya menjadi “Detail Course”.
Kemudian tambahkan Hierarchical Parent ke kelas HomeActivity. Hierarchical Parent berfungsi untuk menentukan induk(parent) dari suatu Activity. Sehingga ketika tombol up ditekan, ia akan menuju ke parent activity-nya. Cara untuk mengaturnya yaitu dengan menambahkan kode berikut pada AndroidManifest.xml:...
Kemudian pada DetailCourseActivity tambahkan kode berikut untuk menampilkan tombol up berupa tanda panah di kiri atas halaman detail.
<activity
android:name=".DetailCourseActivity"
android:label="@string/title_activity_detail_course"
android:parentActivityName=".HomeActivity"
android:theme="@style/AppTheme.NoActionBar">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".HomeActivity" />
</activity>
...Kotlin class DetailCourseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_detail_course)
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
}
}Java public class DetailCourseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detail_course);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
} - Setelah itu, buatlah sebuah blank fragment dan berilah nama AcademyFragment. Jangan lupa untuk hilangkan checklist di Include fragment factory method dan Include interface callbacks.
Lakukan kembali langkah di atas untuk membuat 3 Fragment lagi. Berilah nama ketiga fragment tersebut dengan BookmarkFragment, ModuleListFragment dan ModuleContentFragment. Sehingga tampilan package-nya menjadi seperti ini.
Agar strukturnya menjadi lebih rapi, kelompokkan kelas-kelas di atas sesuai dengan fungsinya. Buatlah sebuah package baru dengan cara klik kanan pada package utama→ new →package dan berilah nama ui. Kemudian buat lagi package di dalam package UI dengan cara klik kanan pada package ui →new →package dan berilah nama academy. Buat lagi dengan langkah yang sama sehingga kelas-kelas berikut tersusun menjadi seperti ini:Catatan:
Jika Anda kesulitan dalam membuat package, Anda bisa menekan tombol setting pada kanan atas, unchecklistCompact Middle Packages. Sehingga tampilannya akan menjadi seperti ini: - Selanjutnya, buatlah package baru untuk menampung kelas model. Klik kanan pada package utama → new → package dan berilah nama data.
Kemudian buatlah beberapa kelas Model berikut:- CourseEntity
Buatlah Class baru dengan nama CourseEntity. Setelah itu, tambahkan kode berikut:Kotlin data class CourseEntity(
var courseId: String,
var title: String,
var description: String,
var deadline: String,
var bookmarked: Boolean = false,
var imagePath: String
)Java public class CourseEntity {
Setelah itu buatlah Constructor dan Getter and Setter-nya, sehingga menjadi seperti ini:
private String courseId;
private String title;
private String description;
private String deadline;
private boolean bookmarked = false;
private String imagePath;
}public class CourseEntity {
private String courseId;
private String title;
private String description;
private String deadline;
private boolean bookmarked = false;
private String imagePath;
public CourseEntity(String courseId, String title, String description, String deadline, Boolean bookmarked, String imagePath) {
this.courseId = courseId;
this.title = title;
this.description = description;
this.deadline = deadline;
if (bookmarked != null) {
this.bookmarked = bookmarked;
}
this.imagePath = imagePath;
}
public String getCourseId() {
return courseId;
}
public void setCourseId(String mCourseId) {
this.courseId = mCourseId;
}
public String getTitle() {
return title;
}
public void setTitle(String mTitle) {
this.title = mTitle;
}
public String getDescription() {
return description;
}
public void setDescription(String mDescription) {
this.description = mDescription;
}
public String getDeadline() {
return deadline;
}
public void setDeadline(String mDeadline) {
this.deadline = mDeadline;
}
public boolean isBookmarked() {
return bookmarked;
}
public void setBookmarked(boolean mBookmarked) {
this.bookmarked = mBookmarked;
}
public String getImagePath() {
return imagePath;
}
public void setImagePath(String mImagePath) {
this.imagePath = mImagePath;
}
} - ContentEntity
Buat lagi lagi Class baru dengan nama ContentEntity. Setelah itu, tambahkan kode berikut:Kotlin data class ContentEntity(
var content: String?
)Java public class ContentEntity {
Setelah itu buatlah Constructor dan Getter and Setter-nya, sehingga menjadi seperti ini:
private String mContent;
}public class ContentEntity {
private String mContent;
public ContentEntity(String content) {
this.mContent = content;
}
public String getContent() {
return mContent;
}
public void setContent(String mContent) {
this.mContent = mContent;
}
} - ModuleEntity
Buat sekali lagi Class baru dengan nama ModuleEntity. Setelah itu, tambahkan kode berikut:Kotlin data class ModuleEntity(
var moduleId: String,
var courseId: String,
var title: String,
var position: Int,
var read: Boolean = false
){
var contentEntity: ContentEntity? = null
}Java public class ModuleEntity {
Setelah itu buatlah Constructor dan Getter and Setter-nya, sehingga menjadi seperti ini:
public ContentEntity contentEntity;
private String mModuleId;
private String mCourseId;
private String mTitle;
private Integer mPosition;
private boolean mRead = false;
}public class ModuleEntity {
public ContentEntity contentEntity;
private String mModuleId;
private String mCourseId;
private String mTitle;
private Integer mPosition;
private boolean mRead = false;
public ModuleEntity(String moduleId, String courseId, String title, Integer position, Boolean read) {
this.mModuleId = moduleId;
this.mCourseId = courseId;
this.mTitle = title;
this.mPosition = position;
if (read != null) {
this.mRead = read;
}
}
public String getModuleId() {
return mModuleId;
}
public void setModuleId(String moduleId) {
this.mModuleId = moduleId;
}
public String getCourseId() {
return mCourseId;
}
public void setCourseId(String courseId) {
this.mCourseId = courseId;
}
public String getTitle() {
return mTitle;
}
public void setTitle(String title) {
this.mTitle = title;
}
public Integer getPosition() {
return mPosition;
}
public void setPosition(Integer position) {
this.mPosition = position;
}
public boolean isRead() {
return mRead;
}
public void setRead(boolean read) {
this.mRead = read;
}
}
- CourseEntity
- Seluruh asset sudah Anda siapkan. Selanjutnya, buatlah package baru untuk menampung kelas pembantu seperti untuk menampung data dummy. Klik kanan pada package utama → new → package dan berilah nama utils.
Kemudian buatlah kelas baru di dalamnya dan beri nama DataDummy. Setelah itu, tambahkan kode berikut:Kotlin object DataDummy {
fun generateDummyCourses(): List<CourseEntity> {
val courses = ArrayList<CourseEntity>()
courses.add(CourseEntity("a14",
"Menjadi Android Developer Expert",
"Dicoding sebagai satu-satunya Google Authorized Training Partner di Indonesia telah melalui proses penyusunan kurikulum secara komprehensif. Semua modul telah diverifikasi langsung oleh Google untuk memastikan bahwa materi yang diajarkan relevan dan sesuai dengan kebutuhan industri digital saat ini. Peserta akan belajar membangun aplikasi Android dengan materi Testing, Debugging, Application, Application UX, Fundamental Application Components, Persistent Data Storage, dan Enhanced System Integration.",
"100 Hari",
false,
"https://www.dicoding.com/images/small/academy/menjadi_android_developer_expert_logo_070119140352.jpg"))
courses.add(CourseEntity("a55",
"Kotlin Android Developer Expert",
"Pada Google I/O 2017, Kotlin diumumkan sebagai bahasa pemrograman yang termasuk dalam bahasa kelas satu (First class) yang didukung untuk pembuatan aplikasi Android, selain Java dan C++. Kotlin adalah bahasa pemrograman yang dibuat oleh JetBrains. Google juga akan memastikan bahwa semua fitur baru di Android, framework, IDE dan keseluruhan library, akan dapat bekerja dan terintegrasi baik dengan bahasa pemrograman Kotlin serta interopable dengan fungsi-fungsi Java yang telah ada sehingga memungkinkan para engineer melakukan perubahan bagian tertentu aplikasi dari Java ke Kotlin dan sebaliknya dengan sangat mudah.",
"50 Hari",
false,
"https://www.dicoding.com/images/small/academy/kotlin_android_developer_expert_logo_070119140227.jpg"))
courses.add(CourseEntity("a47",
"Menjadi Game Developer Expert",
"Semua modul dalam kelas ini telah diverifikasi langsung oleh Asosiasi Game Indonesia (AGI) untuk memastikan materi yang diajarkan relevan dan sesuai dengan kebutuhan industri game saat ini. Peserta akan belajar best practice membuat game seperti Script, Sprite, UI, Gameplay, Input Method, Porting ke Android / iOS, Modul Services (Collaboration, Ads, Analytics dan Google Play Games - Update Oktober 2018), Porting ke VR - Cardboard dan Gear VR (New Mei 2018) dengan Unity 3D. Peserta juga akan belajar langsung membuat 8 game yaitu Casual (Update Agustus 2018), Pilah Sampah (New November 2018), Tower Defense (New November 2018), Arcade (Update Maret 2018), Platformer (Update Januari 2019), FPS, Multiplayer (Update Maret 2018), serta Game Interaktif dengan VR (New Mei 2018).",
"75 Hari",
false,
"https://www.dicoding.com/images/small/academy/menjadi_game_developer_expert_logo_070119140532.jpg"))
courses.add(CourseEntity("a74",
"Membangun Progressive Web Apps",
"Progressive Web Apps adalah aplikasi web yang memanfaatkan beragam fitur web modern sehingga dapat menyajikan pengalaman pengguna seperti aplikasi native. PWA mengubah sajian tampilan yang umumnya dibuka melalui halaman browser menjadi jendela aplikasi tersendiri. Selain itu PWA juga memungkinkan konten halaman diakses dalam mode offline, menampilkan pesan pemberitahuan, hingga akses ke hardware dari perangkat seperti halnya native app.",
"50 Hari",
false,
"https://www.dicoding.com/images/small/academy/membangun_progressive_web_apps_logo_070119142922.jpg"))
courses.add(CourseEntity("a51",
"Belajar Membuat Aplikasi Android untuk Pemula", "Kelas ini didesain oleh Google Authorized Training Partner untuk developer Android di Indonesia. Peserta akan mempelajari materi dasar Android dalam 30 hari dan diarahkan untuk membuat aplikasi sederhana. Terdapat 27 modul yang juga merupakan bagian dari Kelas Menjadi Android Developer Expert. Peserta disarankan setidaknya memiliki pengetahuan tentang programming Java dan atau pemrograman berorientasi objek. Sistem pembelajaran adalah online (dapat diakses kapanpun dan darimanapun selama tersedia internet) dan kehadiran tatap muka tidak diperlukan. Tools yang diwajibkan untuk kelas belajar Android ini adalah Android Studio. Peserta harus submit satu proyek akhir yang akan direview oleh developer expert untuk mendapatkan sertifikat dari kelas ini. Bila menginginkan materi yang lebih komprehensif, silahkan mengikuti kelas Menjadi Android Developer Expert.",
"30 Hari",
false,
"https://www.dicoding.com/images/small/academy/belajar_membuat_aplikasi_android_untuk_pemula_logo_070119140911.jpg"))
return courses
}
fun generateDummyModules(courseId: String): List<ModuleEntity> {
val modules = ArrayList<ModuleEntity>()
modules.add(ModuleEntity(
"{$courseId}m1",
courseId,
"Modul 0 : Introduction",
0))
modules.add(ModuleEntity("{$courseId}m2",
courseId,
"Modul 1 : Teori 1",
1, false))
modules.add(ModuleEntity("{$courseId}m3",
courseId,
"Latihan 1",
2, false))
modules.add(ModuleEntity("{$courseId}m4",
courseId,
"Bedah Kode 1",
3, false))
modules.add(ModuleEntity("{$courseId}m5",
courseId,
"Modul 2 : Teori 2",
4, false))
modules.add(ModuleEntity("{$courseId}m6",
courseId,
"Latihan 2",
5, false))
modules.add(ModuleEntity("{$courseId}m7",
courseId,
"Bedah Kode 2",
6, false))
return modules
}
}Java public class DataDummy {
public static List<CourseEntity> generateDummyCourses() {
ArrayList<CourseEntity> courses = new ArrayList<>();
courses.add(new CourseEntity("a14",
"Menjadi Android Developer Expert",
"Dicoding sebagai satu-satunya Google Authorized Training Partner di Indonesia telah melalui proses penyusunan kurikulum secara komprehensif. Semua modul telah diverifikasi langsung oleh Google untuk memastikan bahwa materi yang diajarkan relevan dan sesuai dengan kebutuhan industri digital saat ini. Peserta akan belajar membangun aplikasi Android dengan materi Testing, Debugging, Application, Application UX, Fundamental Application Components, Persistent Data Storage, dan Enhanced System Integration.",
"100 Hari",
null,
"https://www.dicoding.com/images/small/academy/menjadi_android_developer_expert_logo_070119140352.jpg"));
courses.add(new CourseEntity("a55",
"Kotlin Android Developer Expert",
"Pada Google I/O 2017, Kotlin diumumkan sebagai bahasa pemrograman yang termasuk dalam bahasa kelas satu (First class) yang didukung untuk pembuatan aplikasi Android, selain Java dan C++. Kotlin adalah bahasa pemrograman yang dibuat oleh JetBrains. Google juga akan memastikan bahwa semua fitur baru di Android, framework, IDE dan keseluruhan library, akan dapat bekerja dan terintegrasi baik dengan bahasa pemrograman Kotlin serta interopable dengan fungsi-fungsi Java yang telah ada sehingga memungkinkan para engineer melakukan perubahan bagian tertentu aplikasi dari Java ke Kotlin dan sebaliknya dengan sangat mudah.",
"50 Hari",
null,
"https://www.dicoding.com/images/small/academy/kotlin_android_developer_expert_logo_070119140227.jpg"));
courses.add(new CourseEntity("a47",
"Menjadi Game Developer Expert",
"Semua modul dalam kelas ini telah diverifikasi langsung oleh Asosiasi Game Indonesia (AGI) untuk memastikan materi yang diajarkan relevan dan sesuai dengan kebutuhan industri game saat ini. Peserta akan belajar best practice membuat game seperti Script, Sprite, UI, Gameplay, Input Method, Porting ke Android / iOS, Modul Services (Collaboration, Ads, Analytics dan Google Play Games - Update Oktober 2018), Porting ke VR - Cardboard dan Gear VR (New Mei 2018) dengan Unity 3D. Peserta juga akan belajar langsung membuat 8 game yaitu Casual (Update Agustus 2018), Pilah Sampah (New November 2018), Tower Defense (New November 2018), Arcade (Update Maret 2018), Platformer (Update Januari 2019), FPS, Multiplayer (Update Maret 2018), serta Game Interaktif dengan VR (New Mei 2018).",
"75 Hari",
null,
"https://www.dicoding.com/images/small/academy/menjadi_game_developer_expert_logo_070119140532.jpg"));
courses.add(new CourseEntity("a74",
"Membangun Progressive Web Apps",
"Progressive Web Apps adalah aplikasi web yang memanfaatkan beragam fitur web modern sehingga dapat menyajikan pengalaman pengguna seperti aplikasi native. PWA mengubah sajian tampilan yang umumnya dibuka melalui halaman browser menjadi jendela aplikasi tersendiri. Selain itu PWA juga memungkinkan konten halaman diakses dalam mode offline, menampilkan pesan pemberitahuan, hingga akses ke hardware dari perangkat seperti halnya native app.",
"50 Hari",
null,
"https://www.dicoding.com/images/small/academy/membangun_progressive_web_apps_logo_070119142922.jpg"));
courses.add(new CourseEntity("a51",
"Belajar Membuat Aplikasi Android untuk Pemula", "Kelas ini didesain oleh Google Authorized Training Partner untuk developer Android di Indonesia. Peserta akan mempelajari materi dasar Android dalam 30 hari dan diarahkan untuk membuat aplikasi sederhana. Terdapat 27 modul yang juga merupakan bagian dari Kelas Menjadi Android Developer Expert. Peserta disarankan setidaknya memiliki pengetahuan tentang programming Java dan atau pemrograman berorientasi objek. Sistem pembelajaran adalah online (dapat diakses kapanpun dan darimanapun selama tersedia internet) dan kehadiran tatap muka tidak diperlukan. Tools yang diwajibkan untuk kelas belajar Android ini adalah Android Studio. Peserta harus submit satu proyek akhir yang akan direview oleh developer expert untuk mendapatkan sertifikat dari kelas ini. Bila menginginkan materi yang lebih komprehensif, silahkan mengikuti kelas Menjadi Android Developer Expert.",
"30 Hari",
null,
"https://www.dicoding.com/images/small/academy/belajar_membuat_aplikasi_android_untuk_pemula_logo_070119140911.jpg"));
return courses;
}
public static List<ModuleEntity> generateDummyModules(String courseId) {
ArrayList<ModuleEntity> modules = new ArrayList<>();
modules.add(new ModuleEntity(String.format("%sm1", courseId),
courseId,
"Modul 0 : Introduction",
0,
null));
modules.add(new ModuleEntity(String.format("%sm2", courseId),
courseId,
"Modul 1 : Teori 1",
1,
null));
modules.add(new ModuleEntity(String.format("%sm3", courseId),
courseId,
"Latihan 1",
2,
null));
modules.add(new ModuleEntity(String.format("%sm4", courseId),
courseId,
"Bedah Kode 1",
3,
null));
modules.add(new ModuleEntity(String.format("%sm5", courseId),
courseId,
"Modul 2 : Teori 2",
4,
null));
modules.add(new ModuleEntity(String.format("%sm6", courseId),
courseId,
"Latihan 2",
5,
null));
modules.add(new ModuleEntity(String.format("%sm7", courseId),
courseId,
"Bedah Kode 2",
6,
null));
return modules;
}
} Anda perlu menambahkan permission di AndroidManifest.xml. Bukalah berkas tersebut dan sesuaikan seperti berikut:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.dicoding.academies">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="false"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="GoogleAppIndexingWarning">
...
</application>
</manifest>Sehingga keseluruhan class akan menjadi seperti ini:
Pada modul selanjutnya Anda akan menyiapkan asset-asset yang dibutuhkan untuk proyek Academy. Semangatttt!!!