OLEH:
KELOMPOK 6
Yunita amalia (60900121018)
Riangdana Jurmasari (60900121012)
Muh. Arsy Mawardi. MZ (60900121050)
Annisa Eka Jayanti Santoso (60900121003)
PENDAHULUAN
A. Dasar Teori
API (Application Programming Interface) adalah kumpulan aturan dan
protokol yang digunakan untuk berinteraksi dengan perangkat lunak lain. Ini
memungkinkan dua perangkat lunak untuk berinteraksi satu sama lain. API bisa
digunakan untuk mengintegrasikan perangkat lunak, memungkinkan perangkat lunak
untuk berinteraksi satu sama lain, atau untuk memungkinkan perangkat lunak untuk
menjalankan fungsi tertentu.
Berikut adalah beberapa konsep penting dalam API:
1. Endpoint
Endpoint adalah URL tempat API ditempatkan. Endpoint ini adalah alamat web
tempat Anda dapat mengirim permintaan untuk mendapatkan data atau memposting
data baru.
2. Request
Request adalah pesan yang dikirim dari client ke server. Request ini bisa berupa
GET (untuk mendapatkan data), POST (untuk memposting data baru), DELETE
(untuk menghapus data), dll.
3. Response
Response adalah respon dari server yang diterima setelah request dikirim.
Response ini bisa berupa data yang diminta atau pesan konfirmasi bahwa operasi telah
berhasil dilakukan.
4. Method
IMethod adalah aksi yang ingin dilakukan pada data. Contoh method dalam HTTP
adalah GET, POST, DELETE, dll.
5. Status Code
Status Code adalah kode yang dikirim oleh server sebagai respon terhadap request.
Contoh status code adalah 200 (sukses), 404 (tidak ditemukan), 500 (error server), dll.
BAB II
DESKRIPSI APLIKASI
A. Analisis
Tahap awal dalam pembuatan aplikasi yang menggunakan API adalah
mengembangkan ide untuk aplikasi tersebut. Adapun project yang kami lakukan ini
sesuai dengan tugas yang diberikan oleh Pak Adhy Rizaldy,S.Kom.,M.Kom selaku
dosen pengampu mata kuliah Pemrograman Mobile yaitu membuat aplikasi dengan
menggunakan API. Bahasa pemrograman yang digunakan dalam pembuatan aplikasi
ini adalah kotlin. Dalam pra pembuatannya kita menentukan terlebih dahulu bagaimana
skenario dari aplikasi yang akan dibuat supaya memudahkan dalam proses pembuatan
aplikasi.Selain itu, kami juga menentukan API yang paling cocok untuk digunakan
dalam konteks aplikasi yang sedang di buat.
Aplikasi yang kami rancang adalah Deezer yang merupakan aplikasi musik
yang memberikan pengalaman mendengarkan musik dengan layanan musik streaming.
Dengan menggunakan API Deezer, aplikasi ini memungkinkan pengguna untuk
menjelajahi katalog musik juga Deezer menambahkan lagu ke favorit, semua itu tanpa
meninggalkan aplikasi.
Pembagian Tugas :
Yunita Amalia : Membuat aplikasi dan Laporan Tubes
Riangdana Jurmasari : Membuat aplikasi dan Laporan Tubes
Muh. Arsy Mawardi M.Z : Membuat aplikasi dan Laporan Tubes
Annisa Eka Jayanti Santoso : Membuat aplikasi dan Laporan Tubes
BAB IV
IMPLEMENTASI & HASIL
A. Script / Pengkodean
MainActivity.kt
package com.kelompok6.deezerapi
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.navigation.fragment.NavHostFragment
import androidx.navigation.ui.setupWithNavController
import com.kelompok6.deezerapi.databinding.ActivityMainBinding
import dagger.hilt.android.AndroidEntryPoint
@AndroidEntryPoint
class MainActivity : AppCompatActivity() {
binding.bottomNavigationView2.setupWithNavController(navController
)
binding.bottomNavigationView2.setOnItemSelectedListener {
menuItem ->
when (menuItem.itemId) {
R.id.home -> {
navController.navigate(R.id.homeFragment)
true
}
R.id.favorite -> {
navController.navigate(R.id.favoriteFragment)
true
}
else -> false
}
}
}
}
Penjelasan :
3. Metode `onCreate`:
Metode `onCreate` dipanggil saat aktivitas dibuat. Di dalamnya, layout
aktivitas diinflate menggunakan View Binding, dan fungsi
`setupBottomNavigationView` dipanggil untuk menyiapkan bottom navigation
view.
4. Metode `setupBottomNavigationView`:
Metode ini menangani pengaturan bottom navigation view. Pertama,
mendapatkan `NavHostFragment` dari manajer fragmen menggunakan ID
`navhost` dalam layout. Kemudian, mendapatkan `NavController` dari
`NavHostFragment`. Bottom navigation view diatur untuk bekerja dengan
`NavController` menggunakan `setupWithNavController`. Selanjutnya,
menambahkan listener untuk mendeteksi item yang dipilih dalam bottom
navigation view. Berdasarkan ID item yang dipilih, metode ini mengarahkan
navigasi ke fragment yang sesuai, seperti `homeFragment` atau
`favoriteFragment`.
activity_main.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/navhost"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="0dp"
app:defaultNavHost="true"
app:layout_constraintBottom_toTopOf="@+id/bottomNavigationView2"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:navGraph="@navigation/home_nav" />
<com.google.android.material.bottomnavigation.BottomNavigationVie
w
android:id="@+id/bottomNavigationView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/home_menu" />
</androidx.constraintlayout.widget.ConstraintLayout>
Penjelasan :
1. Deklarasi XML:
Baris pertama menandakan bahwa ini adalah dokumen XML versi 1.0 dan
menggunakan encoding UTF-8. Ini adalah bagian pembuka untuk setiap
dokumen XML.
2. Elemen ConstraintLayout:
Elemen ini mendefinisikan layout menggunakan
`ConstraintLayout`.`ConstraintLayout` adalah tata letak yang kuat di Android
yang memungkinkan penempatan elemen-elemen UI dengan menggunakan
konsep constraint. Atribut `layout_width` dan `layout_height` diatur sebagai
`match_parent` untuk mengisi seluruh ruang yang tersedia. Atribut
`tools:context` memberikan informasi tentang kelas `MainActivity`.
4. BottomNavigationView:
Elemen `BottomNavigationView` menyediakan antarmuka pengguna di
bagian bawah layar untuk melakukan navigasi antara fragmen menggunakan tab
atau item. Atribut `app:menu` mengaitkan menu navigasi yang didefinisikan
dalam file `home_menu.xml`. Lebar diatur sebagai `match_parent`, dan tinggi
disesuaikan dengan kontennya (`wrap_content`). Constraint diatur sehingga
bottom navigation view berada di bagian bawah layar, mengikuti batasan dari
layout parent.
FavoriteFragment.kt
package com.kelompok6.deezerapi
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.room.Room
import com.kelompok6.deezerapi.Adapter.FavoriteRecyclerAdapter
import com.kelompok6.deezerapi.Room.DataDao
import com.kelompok6.deezerapi.Room.RoomDataBase
import com.kelompok6.deezerapi.databinding.FragmentFavoriteBinding
import com.kelompok6.deezerapi.models.album.favoriteMusic
db =
Room.databaseBuilder(requireContext().applicationContext,
RoomDataBase::class.java, "Music")
.allowMainThreadQueries()
.build()
adventDao = db.dataDao()
val recyclerViewAdapter =
FavoriteRecyclerAdapter(adventDao.getAll() as
ArrayList<favoriteMusic>)
binding.FavoriteRecyler.adapter = recyclerViewAdapter
binding.FavoriteRecyler.layoutManager =
LinearLayoutManager(requireContext())
recyclerViewAdapter.notifyDataSetChanged()
}
Penjelasan :
2. Metode `onCreateView`:
Metode `onCreateView` dipanggil ketika fragment pertama kali dibuat. Di
dalamnya, layout fragment di-inflate menggunakan View Binding
(`FragmentFavoriteBinding`) untuk mendapatkan referensi ke elemen-elemen
UI di dalam layout. Ini memastikan bahwa elemen-elemen UI dapat diakses dan
dimanipulasi dengan mudah.
3. Metode `onViewCreated`:
Metode ini bertanggung jawab untuk menyiapkan tampilan fragment setelah
fase `onCreateView`. Database Room dibangun dengan menggunakan
`Room.databaseBuilder`, dan instance dari `DataDao` diinisialisasi.
Selanjutnya, adapter RecyclerView (`recyclerViewAdapter`) diinisialisasi
dengan menggunakan daftar musik favorit dari database melalui
`adventDao.getAll()`, dan diatur pada `FavoriteRecyler` (RecyclerView).
Layout manager untuk RecyclerView diatur sebagai `LinearLayoutManager`,
dan pemanggilan `notifyDataSetChanged` memastikan bahwa tampilan
diperbarui dengan data terbaru dari database.
4. Metode `onDestroyView`:
Metode ini dipanggil ketika tampilan fragment dihancurkan. Dalam konteks
ini, tampaknya terdapat kesalahan sintaks dengan penggunaan `var _binding =
null`. Seharusnya, yang benar adalah `binding = null` untuk membersihkan
referensi ke objek View Binding dan mencegah memory leaks. Meskipun
demikian, kode tersebut tidak sepenuhnya diperlukan, karena Kotlin secara
otomatis akan mengelola referensi yang tidak terpakai saat siklus hidup
fragment berakhir.
<androidx.cardview.widget.CardView
android:id="@+id/cardView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginStart="18dp"
android:layout_marginEnd="18dp"
android:layout_marginBottom="12dp"
app:cardCornerRadius="15dp"
app:cardBackgroundColor="@color/black">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="108dp">
<ImageView
android:id="@+id/imageView"
android:layout_width="108dp"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/ic_launcher_foreground" />
<TextView
android:id="@+id/titleFavoriteMusic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toEndOf="@+id/imageView"
android:layout_marginTop="8dp"
android:gravity="center"
android:text="@string/judul_music"
android:textColor="@color/white"
android:textStyle="bold"/>
<TextView
android:id="@+id/durationFavoriteMusic"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/titleFavoriteMusic"
android:layout_toEndOf="@+id/imageView"
android:layout_marginTop="8dp"
android:layout_marginStart="16dp"
android:textColor="@color/white"
android:text="@string/durasi"
android:textSize="14sp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/durationFavoriteMusic"
android:layout_alignParentEnd="true"
android:orientation="vertical">
<ImageView
android:id="@+id/imgPlayMusic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
app:srcCompat="@drawable/ic_baseline_play_circle_24" />
<ImageView
android:id="@+id/deleteFavorite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:backgroundTint="@color/black"
app:srcCompat="@drawable/ic_baseline_favorite_24" />
</LinearLayout>
</RelativeLayout>
</androidx.cardview.widget.CardView>
</RelativeLayout>
Penjelasan :
1. Deklarasi XML:
Baris pertama adalah deklarasi XML yang menunjukkan versi dokumen dan
pengkodean karakter yang digunakan.
2. Elemen RelativeLayout:
Elemen ini menentukan bahwa tata letak menggunakan `RelativeLayout`,
memungkinkan penempatan elemen-elemen UI secara relatif dalam layout.
Atribut `layout_width` dan `layout_height` diatur sebagai `match_parent` untuk
mengisi seluruh ruang yang tersedia pada layar.
Melalui struktur XML ini, setiap item musik favorit direpresentasikan dengan
jelas dalam tata letak yang terorganisir. Penggunaan `CardView` memberikan
elemen-elemen tersebut tampilan kartu yang bersudut melengkung,
menciptakan antarmuka pengguna yang estetis dan informatif.
ArtistFragment.kt
package com.kelompok6.deezerapi
import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import com.kelompok6.deezerapi.Adapter.ArtistAdapter
import com.kelompok6.deezerapi.Adapter.ArtistAlbumAdapter
import com.kelompok6.deezerapi.ViewModel.DeezerViewModel
import com.kelompok6.deezerapi.databinding.FragmentArtistsBinding
import com.kelompok6.deezerapi.models.album.Album
import com.kelompok6.deezerapi.models.artistX
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.*
@AndroidEntryPoint
class ArtistsFragment : Fragment() {
arguments?.let {
artistId = ArtistsFragmentArgs.fromBundle(it).artistId
println("$artistId")
}
val lmVertical = LinearLayoutManager(requireContext(),
LinearLayoutManager.VERTICAL, false)
binding.rcylerArtistDetails.layoutManager = lmVertical
val layoutManager = LinearLayoutManager(context)
binding.recyclerView.layoutManager = layoutManager
InitRecycler()
fetchCategory(artistId)
viewModel.getArtistData().observe(viewLifecycleOwner,
object : Observer<artistX> {
override fun onChanged(t: artistX?) {
if (t != null) {
adapter.setLists(arrayListOf(t))
println(t)
}
}
})
viewModel.getAlbumLiveData().observe(viewLifecycleOwner,
object : Observer<Album> {
override fun onChanged(t: Album?) {
if (t != null) {
artistAlbumadapter.setListsAlbum(t.data)
println("${t}")
}
println("${t}")
println(viewModel.getAlbumLiveData())
}
})
return view
}
fun InitRecycler() {
adapter = ArtistAdapter()
binding.rcylerArtistDetails.adapter = adapter
artistAlbumadapter = ArtistAlbumAdapter()
binding.recyclerView.adapter = artistAlbumadapter
}
fun fetchCategory(ıdAlbums: Int) {
CoroutineScope(Dispatchers.Main).launch {
job1.await()
job2.await()
}
}
}
Penjelasan Kode:
2. Dagger Hilt:
Anotasi `@AndroidEntryPoint` diterapkan pada kelas `ArtistsFragment`.
Anotasi indari i merupakan bagian Dagger Hilt, sebuah library untuk Android
yang menyederhanakan dependency injection. Ini menandakan bahwa Dagger
Hilt akan menangani dependency injection untuk kelas ini.
5. InitRecycler:
Fungsi `InitRecycler` menginisialisasi adapter untuk RecyclerView
(`adapter` dan `artistAlbumadapter`). Adapter-adapater ini diatur pada
RecyclerView masing-masing, mempersiapkannya untuk menampilkan data.
6. fetchCategory:
Fungsi `fetchCategory` bertanggung jawab untuk mengambil data terkait ID
artis tertentu. Ini menggunakan coroutines untuk menjalankan dua pekerjaan
secara asynchronous: memuat data artis dan memuat data album. Fungsi
`await()` digunakan untuk memastikan bahwa kedua pekerjaan tersebut selesai
sebelum melanjutkan eksekusi kode selanjutnya.
fragment_artist.xml
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rcylerArtistDetails"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@+id/recyclerView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/rcylerArtistDetails"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
Penjelasan :
1. Deklarasi XML:
Baris pertama menyatakan versi dokumen XML dan encoding yang
digunakan. Ini adalah standar pembukaan untuk dokumen XML. Versi XML
diatur menjadi 1.0, dan encoding diatur sebagai UTF-8 untuk mendukung
karakter internasional.
2. Elemen ConstraintLayout:
Elemen ini mendefinisikan layout menggunakan `ConstraintLayout`, yang
memberikan kemampuan untuk menentukan hubungan posisional antara
elemen-elemen UI. Atribut `layout_width` dan `layout_height` diatur sebagai
`match_parent`, yang berarti elemen ini akan mengisi seluruh lebar dan tinggi
yang tersedia di dalam parent layout. Atribut `tools:context` menyediakan
informasi tentang kelas terkait, dalam hal ini, kelas `ArtistsFragment`.
Hasil Run
BAB V
PENUTUP
A. Analisa
● Bahasa pemrograman yang digunakan pada aplikasi ini adalah Bahasa pemrograman
kotlin.
● Terdapat beberapa class di dalam aplikasi musik ini yaitu class ‘ArtistFragment’,
‘DetailsFragment’, ’FavoriteFragment’, ’HomeFragment’, ’MainActivity’,
’MusicFragment’, ’MyHiltApp’.
B. Kesimpulan
● Aplikasi ini adalah aplikasi mendengarkan lagu streaming yang APInya berasal dari
deezer.
● Dengan menggunakan API Deezer, aplikasi ini memungkinkan pengguna untuk
menjelajahi katalog musik Deezer, menambahkan lagu ke favorit dan juga
mendengarkan musik favorit, semua hal itu dilakukan tanpa meninggalkan aplikasi.
C. Referensi
Deezer. (n.d.). Deezer API. Diakses pada 30 Desember 2023, dari
https://developers.deezer.com/api
Google. (2022). Kotlin Android Fundamentals. Diakses pada 20 Januari 2024, dari
https://developer.android.com/courses/kotlin-android-fundamentals/overview?hl=id