news

Senin, 15 Juni 2020

Belajar Membuat Aplikasi Android Studi Kasus Proyek Akademi : Dasar

Belajar Membuat Aplikasi Android Studi Kasus Proyek Akademi

Pada kelas ini, Anda akan berlatih bagaimana mengimplementasikan Android Jetpack yang dikemas dalam sebuah aplikasi Academy. 

Lalu bagaimana konsep, atau gambaran hasil akhir dari aplikasi proyek Academy? Seperti inilah skema yang akan dibuat:

fs_ZUwaoPA1CXo8rr2nfUlynil8jz2yg6GTqyRlX4BctY4AGqtv8oXwgC20UqhX1PG9R5y2twQPIC4gOUckHD821UtVVItTlKUSEBP5rMbvWFUMEblx0MQjmnLsKf5Efc9SaAs0L
Anda akan bermain ViewModel, LiveData, Repository, Injection sederhana, Room, Paging dan masih banyak lagi. Selain itu, Anda akan belajar konsep offline-online dalam pembuatan aplikasi. 
Untuk pembuatan proyek Academy akan dibagi sesuai dengan materi pada modul tersebut. Selain itu, Anda akan dilatih untuk melakukan pengujian setiap ada penambahan atau perubahan fitur baik dengan Unit Test atau Instrumental Test. 
Seperti ini nanti pembagiannya:

Modul 1:
1. Proyek Academy - View Model

Modul 2:
2. Proyek Academy - Repository dan Injection
3. Proyek Academy - LiveData
4. Proyek Academy - Idling Resource

Modul 3:
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:

  1. Buat proyek baru di Android Studio dengan kriteria sebagai berikut :
    Nama ProjectAcademy
    Target & Minimum Target SDKPhone and Tablet, API Level 21
    Tipe Activity Empty Activity
    Activity Name MainActivity

  2. Selanjutnya ubah MainActivity menjadi HomeActivity dengan cara klik kanan di MainActivity Refactor Rename.
    OOH6dB0Ev3x1KqEShyIpA9ypeXeEJuWU3G11EvSU5cBNrf5RrHf8NMb0imI_BTQiaaYZVwewH7iW06hNraY5ZzDd3IBQ5Mg6tkycfhRj877eh6XEI8P0qdjieSGugMmZssSnA2pR
    Ubah juga layout-nya dari activity_main.xml menjadi activity_home.xml dengan cara klik kanan di activity_main Refactor Rename.
    _ezZkGNPVUFpTsH7mDnxm2StBsMe79gNsOqiyBxWZT8eYYZVVjSdHWiHlT28jpDv2CcELhmTosabZTMsCVG4XbuvM4RZzZdGbxULvaYSRV__z9BhrO1L5Cd7ac5J2nJE8vUsAJvH

  3. Selanjutnya, buka build.gradle level project dan tambahkan versi untuk 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'
    }
    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
    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"
    }
    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:
    testImplementation "junit:junit:4.12"
    androidTestImplementation "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.

  4. 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
    }

    }

  5. 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
    }
  6. Setelah menambahkan library, tambahkan Activity dengan tipe Empty Activity dan berilah nama CourseReaderActivity.
    2019121611035435d23e2d0761cab3edceddc2c4dae1ad.png
  7. Buatlah sebuah Activity lagi namun dengan tipe Basic Activity dan beri nama DetailCourseActivity. Ubah title-nya menjadi “Detail Course”.
    202003021117535a4f7527d47da1869869c239d30da9ab.pngKemudian 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:
    ...
    <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>
    ...
    Kemudian pada DetailCourseActivity tambahkan kode berikut untuk menampilkan tombol up berupa tanda panah di kiri atas halaman detail.
    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);
    }

    }
    }

  8. Setelah itu, buatlah sebuah blank fragment dan berilah nama AcademyFragment. Jangan lupa untuk hilangkan checklist di Include fragment factory method dan Include interface callbacks.20191216112838ac295af031493c61dc5ef3c1cad69345.png
    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.
    20191216162248594f14d0d4dfded9c5c147dd01d97ba3.pngAgar 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:201912161623112688e8e62511a75a60656e197cb34efc.pngCatatan:
    Jika Anda kesulitan dalam membuat package, Anda bisa menekan tombol setting pada kanan atas, unchecklistCompact Middle Packages. Sehingga tampilannya akan menjadi seperti ini:
    201912161623341b47fdbd737ac35638b996f217476376.png
  9. Selanjutnya, buatlah package baru untuk menampung kelas model. Klik kanan pada package utama → new → package dan berilah nama data.
    qekq_RKRCcCiBrlrogdk6uBqvdbSScYWi-KiAs3HAxCqMX2QiMe9oTfmxkeM40hzyQS0biy1oTfh3bLnAhf306cgo0k6nc2bFDWFAnkqMEd311eg_VkzYuX2nxAVxyxOGAWS8i93
    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 {
      private String courseId;
      private String title;
      private String description;
      private String deadline;
      private boolean bookmarked = false;
      private String imagePath;
      }
      Setelah itu buatlah Constructor dan Getter and Setter-nya, sehingga menjadi seperti ini:
      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 {
      private String mContent;
      }
      Setelah itu buatlah Constructor dan Getter and Setter-nya, sehingga menjadi seperti ini:
      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 {
      public ContentEntity contentEntity;
      private String mModuleId;
      private String mCourseId;
      private String mTitle;
      private Integer mPosition;
      private boolean mRead = false;
      }
      Setelah itu buatlah Constructor dan Getter and Setter-nya, sehingga menjadi seperti ini:
      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;
      }
      }
  10. 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.
    fl1oDu4vzI1lrzO-GwZyNFKyere_zYxxmKSN9mGmcBNF1JKkuiXaA_sZ0S84zQfa_7N3vGQy9cHc0Z4pVbhw8_PtShTCTPo_K8KLk8loATZBG2lIQ01UgJHvtZC6TvOhHNfpKQ7h
    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;
    }
    }
  11. 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>
  12. Sehingga keseluruhan class akan menjadi seperti ini:
    20191217133248f9c0594b1a0aa7cf297fad2d8b18aa7a.png

Pada modul selanjutnya Anda akan menyiapkan asset-asset yang dibutuhkan untuk proyek Academy. Semangatttt!!!