Oleh :
Septadi Nugraha
11.01.53.0028
13576
i
PERNYATAAN KESIAPAN UJIAN SKRIPSI
Saya, Septadi Nugraha, dengan ini menyatakan bahwa Laporan Skripsi yang
berjudul:
Adalah benar hasil karya saya dan belum pernah diajukan sebagai karya ilimiah,
(Septadi Nugraha)
NIM : 11.01.53.0028
Pembimbing
ii
iii
HALAMAN PENGESAHAN
Telah dipertahankan di depan tim dosen penguji Tugas Akhir Fakultas Teknologi
sebagai salah satu syart guna menyelesaikan Jenjang Program Strata 1, Program
Ketua
Sektretaris
Anggota
MENGETAHUI:
SEMARANG
Dekan
iii
MOTTO DAN PERSEMBAHAN
MOTTO
ketakutanmu.
kegagalan.
PERSEMBAHAN
1. Allah SWT atas segala rakhmat dan hidayahnya yang telah memberikan
2. Kedua orang tua saya dan keluarga besar saya yang selalu mendukung dan
memberikan doa.
5. Semua pihak yang telah membantu dalam penelitian untuk penulisan skripsi
iv
FAKULTAS TEKNOLOGI INFORMASI
UNIVERSITAS STIKUBANK (UNISBANK) SEMARANG
Septadi Nugraha
NIM : 11.01.53.0028
Abstrak
Musik adalah suatu hal yang tidak bisa dipisahkan dari manusia. Sekarang
musik sudah seperti kebutuhan hidup manusia. Dimanapun mereka berada,
mereka ingin mendengarkan musik yang dapat membuat tenang atau menambah
semangat. Musik tidak jauh dari lirik lagu, jika tidak ada lirik lagu maka
musikpun tidak ada. Sebagian manusia tidak mengerti lirik lagu dari musik yang
didengar. Untuk memudahkan manusia dan pecinta musik dalam memutar musik
dan menampilkan lirik lagu dimanapun mereka berada maka dibuatlah Aplikasi
Pemutar Musik Berserta Penampil Lirik.
Dalam menampilkan lirik menggunakan Teknik Scraping Lirik. Teknik
Scraping merupakan teknik untuk memotong halaman HTML dan mengambil
informasi yang dibutuhkan. Untuk menampilkan lirik dibutuhkan koneksi internet,
karena lirik diambil dari website www.azlyrics.com. Pembuatan Aplikasi Pemutar
Musik menggunakan Android Studio, dan berjalan pada sistem operasi android
minimal 4.1 (Jelly Bean).
Kata Kunci
Musik, Lirik, Pemutar Musik, Teknik Scraping Lirik, Android
Pembimbing
v
KATA PENGANTAR
Beserta Penampil Lirik Musik Berbasis Android” Penulisan tugas akhir skripsi
ini bertujuan untuk memenuhi salah satu syarat untuk menempuh jenjang strata
bimbingan dan dukungan penuh dari berbagai pihak yang dengan tulus dan sabar
penulis dapat menyelesaikan laporan tugas akhir skripsi ini dengan tepat waktu.
Dengan kerendahan hati, pada kesempatan ini peneliti mengucapkan rasa terima
1. Tuhan Yang Maha Esa yang selalu memberikan kesehatan, akal, pikiran dan
2. Orang Tua dan keluarga saya yang telah memberikan doa, semangat,
3. Bapak Dr. H. Hasan Abdul Rozak, SH, CN, MM selaku Rektor Universitas
Stikubank Semarang.
Informasi.
vi
5. Bapak Jati Sasongko Wibowo, S.Kom., M.Cs, selaku Ketua Program
penyusunanskripsi ini.
9. Semua pihak yang telah membantu dalam penelitian untuk penulisan skripsi
Semoga Allah SWT memberikan balasan yang lebih besar kepada beliau-
beliau, dan pada akhirnya penulis berharap bahwa penulisan laporan tugas akhir
Penulis
Septadi Nugraha
vii
DAFTAR ISI
HALAMAN JUDUL..................................................................................... i
HALAMAN PERSETUJUAN ...................................................................... ii
HALAMAN PENGESAHAN ....................................................................... iii
MOTTO DAN PERSEMBAHAN ................................................................ iv
ABSTRAK .................................................................................................... v
KATA PENGANTAR .................................................................................. vi
DAFTAR ISI ................................................................................................. viii
DAFTAR TABEL ......................................................................................... xii
DAFTAR GAMBAR .................................................................................... xiii
BAB I PENDAHULUAN
1.1 Latar Belakang ............................................................... 1
1.2 Perumusan Masalah ........................................................ 2
1.3 Batasan Masalah.............................................................. 3
1.4 Tujuan Penelitian ............................................................ 3
1.5 Manfaat Penelitian .......................................................... 3
1.6 Metodologi Penelitian ..................................................... 4
1.6.1 Jenis dan Sumber Data ... ...................................... 4
1.6.2Metode Pengumpulan Data ..................................... 5
1.6.2Metodelogi Pengembangan Sistem ......................... 5
1.7 Sistematika Penulisan. .................................................... 9
viii
BAB III LANDASAN TEORI
3.1 Audio ............................................................................... 18
3.1.1 Jenis Audio ................................................................... 18
3.1.2 Audio Digital ................................................................ 19
3.1.3 Format Audio ...................................................... 19
3.2 Audio Player ................................................................... 20
3.3 Lirik Lagu........................................................................ 21
3.4 Android ........................................................................... 21
3.4.1 Arsitektur Android .............................................. 22
3.4.2 Activity Lifecycle Android ................................. 26
3.4.3 Arsitektur Audio Android ................................... 29
3.5 Android SDK (Software Development Kit) .................... 31
3.5.1 Android Studio .................................................... 32
3.5.2 Fitur – Fitur Android Studio ............................... 32
3.5.3 Perbandingan Android Studio vs Eclipse ADT .. 33
3.6 Database SQlite ............................................................... 33
3.7 Scraping Lirik.................................................................. 34
3.8 Unified Modeling Language (UML) ............................... 34
3.8.1 Diagram UML ................................................. 35
3.8.2 Notasi dalam UML.......................................... 37
BAB IV ANALISA DAN PERANCANGAN SISTEM
4.1 Deskripsi Sistem ............................................................. 42
4.2 Perancangan Sistem............... ......................................... 43
4.2.1 Use Case Diagram............... ............................ 44
4.2.2 Activity Diagram............... .............................. 45
4.2.3 Sequence Diagram............... ........................... 58
4.2.4 Class Diagram............... .................................. 69
4.2.5 Struktur Navigasi............... ............................. 78
4.2.6 Perancangan Desain Interface............... .......... 79
4.3 Analisa Kebutuhan Perangkat Lunak......... ..................... 86
ix
4.3.1 Analisa Kebutuhan Perangkat Keras ................... 87
x
6.15 Tampilan About .............................................................. 116
DAFTAR PUSTAKA
LAMPIRAN
xi
DAFTAR TABEL
xii
DAFTAR GAMBAR
xiii
Gambar 4.17 Activity Diagram Shuffle All ............................................. 55
Gambar 4.18 Activity Diagram Sort By .................................................. 56
Gambar 4.19 Activity Diagram Setting ................................................... 57
Gambar 4.20 Activity Diagram About ..................................................... 57
Gambar 4.21 Sequence Diagram Library Song ....................................... 58
Gambar 4.22 Sequence Diagram Library Album .................................... 59
Gambar 4.23 Sequence DiagramLibrary Artis ........................................ 59
Gambar 4.24 Sequence DiagramPlaylist ................................................. 60
Gambar 4.25 Sequence DiagramPlaying Queue ...................................... 61
Gambar 4.26 Sequence DiagramLyrics ................................................... 61
Gambar 4.27 Sequence DiagramScraping Lyrics .................................... 62
Gambar 4.28 Sequence DiagramPlaying Song ........................................ 63
Gambar 4.29 Sequence DiagramPause .................................................... 64
Gambar 4.30 Sequence DiagramShuffle .................................................. 64
Gambar 4.31 Sequence DiagramRepeat .................................................. 65
Gambar 4.32 Sequence DiagramPrevious ............................................... 65
Gambar 4.33 Sequence DiagramNext...................................................... 66
Gambar 4.34 Sequence DiagramSearch................................................... 66
Gambar 4.35 Sequence DiagramShuffle All............................................ 67
Gambar 4.36 Sequence DiagramSort By ................................................. 68
Gambar 4.37 Sequence DiagramSetting .................................................. 68
Gambar 4.38 Sequence DiagramAbout ................................................... 69
Gambar 4.39 Class DiagramLibrary Song ............................................... 70
Gambar 4.40 Class DiagramLibrary Album ............................................ 70
Gambar 4.41 Class DiagramLibrary Artis ............................................... 71
Gambar 4.42 Class DiagramPlaylist ........................................................ 71
Gambar 4.43 Class DiagramPlaying Queue ............................................ 72
Gambar 4.44 Class DiagramLyrics .......................................................... 73
Gambar 4.45 Class DiagramScraping Lyrics ........................................... 73
Gambar 4.46 Class DiagramPlayer .......................................................... 74
Gambar 4.47 Class DiagramSearch ......................................................... 75
xiv
Gambar 4.48 Class DiagramShuffle All .................................................. 76
Gambar 4.49 Class DiagramSort By ........................................................ 76
Gambar 4.50 Class DiagramSetting ......................................................... 77
Gambar 4.51 Class DiagramAbout .......................................................... 77
Gambar 4.52 Struktur Navigasi Aplikasi Pemutar Musik ....................... 78
Gambar 4.53 Rancangan Halaman Menu ................................................ 80
Gambar 4.54 Rancangan HalamanLibrary Song ..................................... 80
Gambar 4.55 Rancangan Halaman Library Album ................................. 81
Gambar 4.56 Rancangan Halaman Library Artis..................................... 82
Gambar 4.57 Rancangan Halaman Playlist.............................................. 82
Gambar 4.58 Rancangan HalamanPlaying Queue ................................... 83
Gambar 4.59 Rancangan Halaman Lyrics ............................................... 83
Gambar 4.60 Rancangan HalamanPlayer ................................................ 84
Gambar 4.61 Rancangan HalamanSearch ................................................ 85
Gambar 4.62 Rancangan HalamanSetting ............................................... 85
Gambar 4.63 Rancangan HalamanAbout................................................. 86
Gambar 5.1 Halaman Menu ................................................................... 89
Gambar 5.2 Halaman Library Song ....................................................... 90
Gambar 5.3 HalamanLibrary Album ..................................................... 91
Gambar 5.4 HalamanArtis ..................................................................... 92
Gambar 5.5 HalamanPlaylist ................................................................. 92
Gambar 5.6 HalamanPlaying Queue ...................................................... 93
Gambar 5.7 HalamanLyrics ................................................................... 94
Gambar 5.8 HalamanPlayer ................................................................... 95
Gambar 5.9 HalamanSeacrh .................................................................. 96
Gambar 5.10 HalamanSetting .................................................................. 97
Gambar 5.11 HalamanAbout ................................................................... 98
Gambar 6.1 Tampilan Menu .................................................................. 100
Gambar 6.2 TampilanLibrary Song ....................................................... 102
Gambar 6.3 TampilanLibrary Album .................................................... 103
Gambar 6.4 TampilanAlbum Song ........................................................ 104
xv
Gambar 6.5 TampilanLibrary Artis ....................................................... 105
Gambar 6.6 TampilanArtis Album ........................................................ 106
Gambar 6.7 TampilanPlaylist ................................................................ 107
Gambar 6.8 TampilanPlaying Queue ..................................................... 109
Gambar 6.9 TampilanLyrics .................................................................. 110
Gambar 6.10 TampilanPlayer .................................................................. 112
Gambar 6.11 TampilanSearch.................................................................. 114
Gambar 6.12 TampilanSetting ................................................................. 115
Gambar 6.13 TampilanAbout .................................................................. 116
xvi
BAB I
PENDAHULUAN
komunikasi suara dan alat pengiriman pesan saja. Dengan semakin bertambahnya
kebutuhan akan fitur-fitur baru untuk mobile phone, membuat para vendor
baru pada mobile phone di tandai dengan munculnya suatu Sistem Operasi yaitu
satu teknologi yang diaplikasikan di perangkat mobile phone saat ini yaitu
teknologi audio atau perangkat suara.Fungsi dari audio adalah menghasilkan suara
berbagai format seperti MP3, WAV, AAC, dan lain-lain. Perkembangan aplikasi
pemutar musik pada android sudah cukup banyak, berbagai aplikasi memiliki
1
Aplikasi ini dibangun dengan pemograman java Android menggunakan
bahasa pemograman java,ADT sebagai plugin untuk Android Studio, dan SDK
Saat ini aplikasi pemutar musik di Playstore hanya untuk memutar musik
yang ada di Android, sangat sedikit aplikasi pemutar musik yang menampilkan
lirik lagu. Aplikasi pemutar musik yang menampilkan lirik lagu di Playstore
sebagian aplikasi berbayar dan harus membeli untuk menikmati fasilitas lirik lagu.
Banyak penikmat musik yang belum mengerti tentang tata cara membeli aplikasi
lagu membuat penikmat musik harus mencari sendiri lirik lagu melalui internet
Berbasis Android , agar penikmat musik mudah mencari lirik lagu dari musik
2
2. Bagaimana membuat aplikasi yang dapat menampilkan lirik lagu dari
musik yang sedang diputar tanpa harus mencari lirik melalui internet
browser.
yang terlalu luas, maka pembahasan ini di batasi dengan hal-hal sebagai berikut :
Tujuan dari penelitian ini adalah untuk membuat sebuah Aplikasi Pemutar
Musik Beserta Penampil Lirik Musik Berbasis Android yang dapat menampilkan
a. Bagi Pengguna
3
b. Bagi UNISBANK
android
c. Bagi Penulis
mengumpulkan data.
1. Data Primer
4
2. Data Sekunder
sistem ini.
1. Survey
2. Studi Pustaka
Pada penelitian ini model proses yang di gunakan adalah model Waterfall.
Model Waterfall adalah sebuah contoh dari proses perencanaan, dimana semua
5
Gambar 1.1 Model Proses Waterfall
(Sumber : Roger S. Pressman, 2011)
Berikut ini adalah penjelasan dari Model Waterfall :
6
2. Tahap Perancangan Sistem dan Perangkat Lunak (System and Software
Design)
komponen-komponen tersebut.
Testing)
7
4. Tahap Integrasi dan Pengujian Sistem (Integration and System Testing)
Unit program diintegrasikan dan diuji sebagai sistem yang lengkap untuk
Tahap ini biasanya merupakan fase siklus hidup yang paling lama.Sistem
8
1.7 Sistematika Penulisan
Secara garis besar skripsi ini terdiri dari 7 (tujuh) bab dengan beberapa sub
bab. Agar mendapat arah dan gambaran yang jelas mengenai hal yang tertulis,
BAB I PENDAHULUAN
Pada bab ini berisi tentang latar belakang masalah, perumusan masalah,
Pada bab iniberisi tentang kutipan dari skripsi, jurnal, dan artikel yang
Pada bab ini berisi tentang dasar teori yang di gunakan sebagai
berbasis Android.
BAB V IMPLEMENTASI
Bab ini berisi tentang implementasi dari program yang di buat, dan
9
BAB VI HASIL PENELITIAN DAN PEMBAHASAN
Bab ini membahas tentang hasil dari penelitian dan program yang
sudah di buat.
10
BAB II
TINJAUAN PUSTAKA
Pada bagian ini akan di paparkan tentang tinjauan pustaka yang di pakai
dalam laporan Tugas Akhir “Aplikasi Pemutar Musik Beserta Penampil Lirik
penelitian ini adalah membuat aplikasi pemutar audio streaming berbasis android
adalah pada penambahan, edit dan delete data yang dapat secara langsung
dilakukan oleh user dalam waktu yang singkat. Hal ini dapat dilakukan karena
data yang disimpan berupa URL dan bukan file lagu sehingga membantu
koneksi internet yang cepat dan stabil untuk performace yang baik dari aplikasi
Mp3-Stream.
11
Nova Suparmanto, tahun 2013,dengan judul “Analisis Pengembangan
ini bertujuan untuk meningkatkan kemampuan siswa dalam belajar bahasa Inggris
interaktif dan menyenangkan. Terdapat lirik 2 bahasa yaitu bahasa Indonesia dan
lunak yang dikembangkan sesuai standar ISO 9126 dan uji materi, serta
mengetahui analisis hasil software media FL. Metode yang digunakan adalah
Validasi, Revisi, dan Uji Coba. Uji materi diteliti menggunakan checklist berupa
adalah suatu hal yang tidak bisa dipisahkan dari manusia pada saat ini. Kalau
dilihat dari perkembangannya, pada zaman dahulu musik digunakan hanya untuk
mereka ingin mendengarkan musik yang dapat membuat tenang atau menambah
12
semangat.Untuk memudahkan manusia memutar musik dimanapun mereka
berada, maka penulis mencoba membuat sebuah aplikasi yang dapat membaca
format file musik sebagai pengembangan dari format yang sudah ada. Aplikasi
pemutar musik ini dibuat untuk sebagai alternatif dalam memainkan atau memutar
file musik. Aplikasi ini, dibuat dengan menggunakan Eclipse serta bahasa
pemograman Java dengan operating system (OS) Android. Aplikasi ini akan
berjalan pada sistem operasi android minimum versi 2.3 (Ginggerbread) atau
lebih.
Eric Megah Perdana , tahun 2012 dengan judul “Aplikasi Pencari Lirik
bahwa Audio player didefinisikan sebagai media player yang berfungsi untuk
memutar audio digital, misalnya file audio. Format audio yang sering digunakan
adalah MP3. Namun, beberapa audio player hanya dapat digunakan untuk
memainkan lagu. Tidak memiliki fitur untuk menampilkan lirik lagu. Hal ini
bermain lagu. Menurut masalah tersebut, akan membuat aplikasi pencari lirik lagu
ini, pengguna bisa mendapatkan lirik lagu sambil memainkan lagu, seperti
karaoke. Dengan menggunakan teknik grabbing untuk mengambil lirik dari situs
13
2.2 Perbedaan Penelitian yang Dilakukan Dengan Penelitian yang
Terdahulu
aplikasi pemutar musik yang memutar file audio berformat MP3 dan dapat
pada cara memutar lagu dengan menggunakan URL sebagai link untuk mengakses
lagu dengan memakai koneksi internet. Pada Aplikasi yang sedang dikembangkan
tidak menggunakan URL untuk memutar lagu, tetapi dengan mencari secara
Platform Android”. Perbedaan terleteak pada tujuan aplikasi Fun Lyrics untuk
vocabulary melalui lirik lagu. Pada Aplikasi yang sedang dikembangkan tujuan
pembuatan aplikasi untuk menampilkan lirik lagu dari lagu yang sedang diputar,
Musik Berbasis Android”. Perbedaan terletak pada sistem operasi android, serta
14
tools pembuat aplikasi. Berjalan menggunakan sistem operasi android mininum
aplikasi.
merupakan aplikasi pemutar musik yang dapat menampilkan lirik dari lagu yang
dengan mengambil lirik dari website lalu memotong dan mengambil halaman lirik
Development Kit) sebagai alat bantu dan API dengan menggunakan bahasa
Android .
15
2.2.1 Perbedaan Penelitian Dalam Bentuk Tabel
Untuk Platform
Android
16
5 Septadi Nugraha Perancangan Waterfall Menampilkan lirik pada
dari website.
17
BAB III
LANDASAN TEORI
3.1 Audio
Audio adalah suara atau bunyi yang dihasilkan oleh getaran suatu benda,
agar dapat tertangkap oleh telinga manusia getaran tersebut harus kuat minimal 20
kali/detik. Suara yaitu suatu getaran yang dihasilkan oleh gesekan , pantulan dan
terdiri dari Amplitudo dan juga waktu. Suara dibangun oleh periode, Apabila
Definisi audio yang lainnya adalah merupakan salah satu elemen yang
dalam bentuk suara, ialah suatu sinyal elektrik yang akan membawa unsur-unsur
diantaranya :
18
3. Audio Modem Riser (AMR) adalah suatu istilah yang dipakai untuk
(Sora :2014)
suaranya. Sebagai proses digitalisasi terhadap format rekaman musik analog, lagu
atau musik digital mempunyai beraneka ragam format yang bergantung pada
Ada berbagai macam format atau ekstensi audio yang dapat ditemui
kbps.
19
4. Advanced Audio Coding (AAC) adalah Format yang merupakan bagian
5. Ogg Vorbis adalah satu-satunya format audio yang garatis atau terbuka
6. Real Audio adalah suatu format audio yang sering ditemui pada bitrate
untuk layanan streaming audio pada bitrate 128 kbps atau lebih dengan
sayangnya format audio ini hanya cocok untuk suara yang dihasilkan
oleh synthesizer.
( Sora :2014)
memutar audio digital termasuk disc audio seperti CD/DVD dan file audio.
Format audio yang sering digunakan adalah AAC, FLAC, MP3, Ogg, WAV, dan
WMA.
20
Kutipan dari pakar multimedia mengatakan bahwa pengertian audio
gendang telinga manusia. Sehingga dapat disimpulkan bahwa audio player adalah
alat untuk memainkan file media digital yang merupakan perubahan tekanan
Lirik lagu merupakan ekspresi seseorang tentang suatu hal yang sudah
penyair atau pencipta lagu melakukan permainan kata-kata dan bahasa untuk
menciptakan daya tarik dan ciri khas terhadap lirik atau syairnya. Permainan
bahasa ini dapat berupa permainan vokal, gaya bahasa maupun penyimpangan
makna kata dan diperkuat dengan penggunaan melodi dan notasi musik yang
disesuaikan dengan lirik lagunya. Dalam fungsinya sebagai sarana hiburan lirik
mempunyai sasaran informasi yang tepat, enak didengar dan dimengerti oleh
pendengar sehingga apa yang diinginkan oleh penyanyi sampai kepada pendengar.
(Perdana, 2012)
3.4 Android
bergerak. Awalnya, Google Inc. membeli Android Inc. pendatang baru yang
21
Android di bentuklah Open Handset Alliance, Konsorium dari 34 perusahaan
lisensi Apache, sebuah lisensi perangkat software dan standar terbuka perangkat
seluler.
Di dunia ini terdapat dua jenis distributor sistem operasi Android. Pertama
yang mendapat dukungan penuh dari Google atau Google Main Service (GMS)
yang kedua adalah yang benar-benar bebas distribusinya tapa dukungan langsung
Kusuma,dkk,2013)
adalah kernel. Google menggunakan kernel Linux versi 2.6 untuk membangun
management, dan beberapa driver hardware. Bertempat di level yang sama dengan
library adalah lapisan runtime yang mencakup serangkaian inti library Java.
22
framework, yang mencakup program untuk mengatur fungsi - fungsi dasar
smartphone.
1. Linux Kernel
android bukanlah linux, karena dalam android tidak terdapat paket standar yang
dimiliki oleh linux lainnya. Linux merupakan sistem operasi terbuka yang handal
dalam manajemen memori dan proses. Oleh karenanya pada android hanya
manajemen proses, jaringan dan driver. Kernel linux menyediakan driver layar,
23
2. Libraries
dengan standar Berkeley Software Distribution (BSD) hanya setengah dari yang
a) Media Library untuk memutar dan merekam berbagai macam format audio
dan video.
b) Surface Manager untuk mengatur hak akses layer dari berbagai aplikasi.
2D dan 3D.
3. Android Runtime
merupakan mesin virtual yang membuat aplikasi android menjadi lebih tangguh
dengan paket pustaka yang telah ada. Dalam Android Runtime terdapat 2 bagian
utama, diantaranya:
efisien.
24
4. Application Framework
untuk mengakses perangkat, serta mengatur tampilan user interface dan sumber
daya aplikasi. Bagian terpenting dalam kerangka aplikasi android adalah sebagai
pesan masuk, janji, dan lain sebagainya yang akan ditampilkan pada status
bar.
5. Application Layer
Puncak dari diagram arsitektur android adalah lapisan aplikasi dan widget.
Lapisan aplikasi merupakan lapisan yang paling tampak pada pengguna ketika
tanpa mengetahui proses yang terjadi dibalik lapisan aplikasi. Lapisan ini berjalan
25
dalam Android runtime dengan menggunakan kelas dan service yang tersedia
operasi lainnya. Pada android semua aplikasi, baik aplikasi inti maupun aplikasi
pihak ketiga berjalan diatas lapisan aplikasi dengan menggunakan pustaka API
Pada saat aplikasi berjalan pada sistem Android sebuah aktifitas program
terjadi dalam beberapa pernyataan program atau tahapan (state) . Setiap pengguna
sistem Android tidak dapat melakukan kontrol terhadap tahapan tersebut, semua
sudah di atur (managed) oleh system. Namun demikian, sebagai pengguna dapat
method ini :
1. onCreate()
2. onStart()
3. onResume()
4. onPause()
5. onStop
6. onDestroy()
7. onRestart()
8. onSaveInstanceState()
9. onRestoreInstanceState()
Lebih jelas tahapan ( state ) yang terjadi bisa dilihat gambar berikut ini :
26
Gambar 3.2 Activity Lifecycle Android
(Sumber :Https://ows.edb.utexas.edu)
1. onCreate( Bundle )
Method ini dipanggil ketika aktifitas pertama kali dimulai. Kita dapat
memiliki satu parameter yang dapat bernilai null atau bernilai informasi
).
2. onStart( )
27
3. onResume( )
Method ini dipanggil ketika aktifitas anda dinyatakan siap ber interaksi
dengan user. Ini adalah aktifitas yang paling tepat untuk menyertakan
4. onPause( )
biasanya terjadi ketika aktifitas berjalan di atas aktifitas ini. Pada state ini
5. onStop( )
Method ini dipanggil saat aktifitas anda tidak bisa dilihat lagi oleh user
dan tidak dibutuhkan untuk sementara waktu. Jika memori dalam keadaan
6. onRestart( )
Jika method ini dipanggil , berarti aktifitas anda sedang di tampilkan ulang
7. onDestroy( )
28
8. onSaveInstanceState(Bundle)
9. onRestoreInstanceState(Bundle)
(http://dev.xbata.com/)
hardware.
diimplementasikan dan menunjuk pada kode program lainnya yang terlibat dalam
pelaksanaannya.
29
Gambar 3.3 Arsitektur Audio Android
(Sumber : https://source.android.com/)
1. Application framework
memanggil sesuai class JNI untuk mengakses kode asli yang berinteraksi
2. JNI
30
3. Native framework
4. Binder IPC
batas proses.
5. Media server
6. HAL
7. Kernel driver
(https://source.android.com/)
kesempatan bagi semua orang untuk membuat aplikasi yang dibutuhkan, yang
31
3.5.1 Android Studio
(IDE) untuk platform Android. Android Studio ini diumumkan pada tanggal 16
Mei 2013 pada Konferensi Google I/O oleh Produk Manajer Google, Ellie
Powers. Android studio bersifat free dibawah Apache License 2.0. Android Studio
awalnya dimulai dengan versi 0.1 pada bulan mei 2013, Kemudian dibuat versi
beta 0.8 yang dirilis pada bulan juni 2014. Yang paling stabil dirilis pada bulan
pengembangkan dari Eclipse IDE, dan dibuat berdasarkan IDE Java populer, yaitu
(https://www.academia.edu/)
fitur-fitur baru dibandingkan dengan Eclipse IDE. Berbeda dengan Eclipse yang
perangkat.
32
Built-in support untuk Google Cloud Platform, sehingga mudah untuk
(Herdi: 2014)
Studio ADT
refactoring
dengan SQLite, SQLite adalah salah satu software basis data yang tertanam yang
sangat populer, kombinasi SQL interface dan penggunaan memory yang sangat
sedikit dengan kecepatan yang sangat cepat. SQLite di android termasuk dalam
33
Android runtime, sehingga setiap versi dari android dapat membuat database
dengan SQLite.
sebagai database yang open-source, stand alone SQL database, berukuran kecil,
tidak membutuhkan administrasi, tanpa server, tanpa file konfigurasi dan juga
telah digunakan pada banyak aplikasi terkenal. Pada Android, database yang
dibuat untuk suatu aplikasi hanya bias diakses oleh aplikasi itu sendiri, aplikasi
lain tidak akan bisa mengaksesnya kecuali jika ingin berbagi databasenya yaitu
Kusuma, 2013)
bahasa markup seperti HTML atau XHTML, dan menganalisis dokumen tersebut
untuk diambil data tertentu dari halaman tersebut untuk digunakan bagi
suatu bahasa pemrograman visual, tetapi UML memberikan arah untuk bergerak
dan saling menukar model dengan mudah dan dimengerti secara umum. UML
34
Jadi untuk mengaplikasikan kita dapat menggunakan beberapa tool yang
Use case adalah abstraksi dari interaksi antara system dan actor. Use case
bagaimana system akan terlihat di mata user. Sedangkan use case diagram
dan client.
2. Activity Diagram
dapat juga digunakan untuk aktifitas lainnya seperti use case atau interaksi
3. State Diagram
Menggambarkan semua state (kondisi) yang dimiliki oleh suatu objek dari
berupa objek lain yang mengirim pesan. State class tidak digambarkan
untuk semua class, hanya yang mempunyai sejumlah state yang terdefinisi
dengan baik dan kondisi class berubah oleh state yang berbeda.
35
4. Class Diagram
deskripsi class, package dan objek beserta hubungan satu sama lain seperti
5. Sequence Diagram
dikirim antara objek juga interaksi antara objek, sesuatu yang terjadi pada
6. Component Diagram
antaranya. Komponen piranti lunak adalah modul berisi code , baik berisi
source code maupun binary code , baik library maupun executable , baik
yang muncul pada compile time, link time , maupun run time . Umumnya
komponen terbentuk dari beberapa class dan/atau package , tapi dapat juga
36
7. Deployment Diagram
lain yang bersifat fisikal Sebuah node adalah server, workstation , atau
piranti keras lain yang digunakan untuk men- deploy komponen dalam
lingkungan sebenarnya.
8. Collaboration Diagram
(Meilin, 2010)
1. Actor
aplikasi komputer, seperti orang, benda atau lainnya. Tugas actor adalah
37
Gambar 3.4 Notasi Actor
(Sumber : Hermawan, 2004)
2. Class
Notasi utama dan yang paling mendasar pada diagram UML adalah notasi
(Hermawan, 2004)
Use case adalah deskripsi fungsi dari sebuah sistem dari perspektif
38
4. Interaction
yang tersusun dari nama operasi, parameter yang dikirim dan tipe
6. Note
39
model. Note ini bisa disertakan ke semua elemen notasi yang lain.
(Hermawan, 2004)
pada salah satu elemen memberi pengaruh pada elemen lain. Elemen yang
ada di bagian tanda panah adalah elemen yang tergantung pada elemen
8. Association
(multiplicity antar class) dan apakah suatu class menjadi bagian dari class
40
9. Generalization
41
BAB IV
Aplikasi Pemutar Musik Beserta Penampil Lirik Musik Berbasis Android ini
dibuat guna ditujukan bagi pengguna yaitu masyarakat dan penikmat musik.
Aplikasi ini dapat digunakan untuk memutar lagu yang ada di smartphone android
dan dapat menampilkan lirik lagu dari lagu yang sedang diputar.
Pada gambar 4.1 dijelaskan tentang proses scraping lirik untuk mencari
lirik, mengambil lirik, dan menampilkan lirik. Lirik lagu yang akan ditampilkan
diambil berdasarkan dari nama artis dan judul lagu yang sedang diputar. Lagu
dengan format yang benar terdiri dari dua id yaitu id nama artis dan id judul lagu.
Setelah diambil nama artis dan judul lagu, sistem akan mengakses website
42
www.azlyrics.com untuk mencari lirik. Metode pencarian lirik dengan
mencocokkan id nama artis dan id judul lagu dengan id nama artis dan id judul
HTML lirik lagu, dan halaman HTML akan dipotong untuk mengambil lirik lagu.
Lirik lagu yang telah diambil akan ditampilkan, jika dua id yang terdiri dari id
nama artis dan id judul lagu tidak cocok atau tidak ditemukan pada website
yang berjalan dan merupakan tahap lanjutan dari analisa sistem, dimana pada
data dengan bantuan komputer. Rancangan sistem yang baik akan diterapkan
proses suatu data agar tujuan dari suatu organisasi dapat tercapai, sedangkan
tujuan dari perancangan sistem secara umum adalah memberikan gambaran secara
43
4.2.1 Use Case Diagram
3. Pengguna dapat melihat lagu apa saja yang telah diputar dapat memilih
4. Pengguna dapat melihat lirik lagu yang sedang diputar dengan memilih
library Jsoup untuk mengakses web tanpa melalui browser. Selain untuk
diinginkan.
44
5. Dengan menu Setting pengguna dapat melakukan setting pada aplikasi.
6. Pada saat memutar lagu atau Playing Song pengguna dapat menggunakan
Shuffle All.
Sort By.
10. Pengguna dapat melihat informasi pembuat aplikasi dengan memilih menu
About.
sehingga dapat juga digunakan untuk aktifitas lainnya seperti use case atau
interaksi.
45
Keterangan Gambar 4.3 Activity Diagram Library Song.
3. User memilih menu Library dan memilih menu Song, maka sistem
46
c. Activity Diagram Library Artis
3. User memilih menu Library dan pilih menu Artis, maka sistem akan
47
Keterangan Gambar 4.6 Activity Diagram Playlist.
48
f. Activity Diagram Lyrics
1. User memilih lagu untuk diputar, maka sistem akan memutar lagu.
2. Ketika user memilih menu Lyrics, maka sistem akan mencari lirik.
4. Jika sistem menemukan lirik maka lirik akan ditampilkan dan user
5. Jika sistem tidak menemukan lirik maka lirik tidak akan tampil.
49
g. Activity Diagram Scraping Lyrics
lagu.
judul lagu dengan id nama artis dan id judul lagu yang ada di website
ww.azlyrics.com
lirik lagu, dan halaman HTML akan dipotong untuk mengambil lirik
lagu.
50
h. Activity Diagram Playing Song
daftar lagu.
51
Keterangan Gambar 4.11 Activity Diagram Pause.
3. Ketika lagu sudah diputar dan user memilih tombol pause, maka
3. Ketika lagu sudah diputar dan user memilih tombol shuffle, maka
52
k. Activity Diagram Repeat
3. Ketika lagu sudah diputar dan user memilih tombol repeat, maka
53
Keterangan Gambar 4.14 Activity Diagram Previous.
3. Ketika lagu sudah diputar dan user memilih tombol previous, maka
3. Ketika lagu sudah diputar dan user memilih tombol Next, maka
54
n. Activity Diagram Search
hasil search yang dapat dilihat oleh user, jika sistem tidak
55
Keterangan Gambar 4.17 Activity Diagram Shuffle All.
2. Sistem akan memutar semua lagu yang ada dengan urutan acak.
1. User memilih menu Sort By, maka sistem akan menampilkan tipe
sort by.
56
q. Activity Diagram Setting
aplikasi.
oleh user.
57
Keterangan Gambar 4.20 Activity Diagram About.
aplikasi.
Song Interface.
58
b. Sequence Diagram Library Album
Interface.
59
Keterangan Gambar 4.23 Sequence Diagram Library Artis.
Interface.
Artis Interface.
Playlist.
Playlist Interface.
60
e. Sequence Diagram Playing Queue
Interface.
Queue Interface.
61
Keterangan Gambar 4.26 Sequence Diagram Lyrics.
62
3. Scraping Lyrics proses berfungsi untuk mendapatkan halaman
Song Interface
untuk diputar.
oleh user.
63
i. Sequence Diagram Pause
yang diputar.
64
2. Lagu yang sudah diputar akan ditampilkan di Player Interface.
65
Keterangan Gambar 4.32 Sequence Diagram Previous.
66
Keterangan Gambar 4.34 Sequence Diagram Search.
di Search Interface.
1. User dapat melihat lagu pada Library Song Interface dan memilih
urutan acak.
67
p. Sequence Diagram Sort By
1. User dapat melihat lagu pada Library Song Interface dan memilih
dan urutan lagu yang telah diurutkan oleh sort akan ditampilkan di
68
3. Setting proses berfungsi untuk menampilkan setting pada Setting
user.
aplikasi.
About Interface.
69
a. Class Diagram Library Song
SongDB.
70
2. Class SongDB berisi tentang lagu beserta informasi lagu, class
class SongDB.
SongDB.
71
Keterangan Gambar 4.42 Class Diagram Playlist.
SongDB.
SongDB.
Playlist Interface.
SongDB.
72
f. Class Diagram Lyrics
LyricsDB.
LyricsDB.
Lyrics Interface.
73
2. Class LyricsDB berisi tentang lirik beserta informasi lirik, class
Lyrics Interface.
Pause Song, Previous Song, repeat Song, Playing Song dan Next
Song.
74
3. Tombol perintah yang ada di class Player Interface akan
SongDB.
SongDB.
Seacrh Interface.
75
j. Class Diagram Shuffle All
class SongDB.
All.
1. Sort By terdiri dari 3 class, yaitu Library Song Interface, Sort, dan
SongDB.
76
2. Class SongDB berisi tentang lagu beserta informasi lagu, class Sort
SongDB.
menampilkan about.
77
4.2.5 Struktur Navigasi
2. Pada saat pengguna memilih menu Library maka akan ditampilkan Song
yang berupa daftar lagu. Jika memilih Album akan ditampilkan daftar
album, jika pengguna ingin melihat artis maka pilih Artis pada menu
Library.
3. Jika pengguna memilih menu Playlist maka akan ditampilkan playlist atau
daftar putar, pengguna juga dapat membuat daftar putar sendiri yang
78
4. Jika pengguna ingin melihat lagu apa saja yang telah diputar dapat
menghentikan lagu, Play untuk memutar lagu atau melanjutkan lagu yang
telah ter-pause, Repeat untuk mengulang daftar lagu yang diputar, Next
6. Jika pengguna ingin melihat lirik lagu yang sedang diputar dapat memilih
menu Lyrics.
Setting
karena yang pertama kali di lihat ketika aplikasi di jalankan adalah tampilan
79
Gambar 4.53 Rancangan Halaman Menu
daftar lagu yang ada. Halaman Library Song berguna untuk memutar lagu dengan
memilih lagu.
80
3. Rancangan Halaman Library Album
daftar Album dari lagu yang ada. Tata letak album berupa grid yang berurutan
sesuai dari jumlah album yang ada. Setiap grid album menampilkan nama album
daftar Artis dari lagu yang ada. Tata letak artis berupa grid yang berurutan sesuai
dari jumlah artis yang ada. Setiap grid artis menampilkan nama artis, jumlah
81
Gambar 4.56 Rancangan Halaman Library Artis
halaman Playlist. Pada halaman Playlist menampilkan daftar putar lagu yang ada
dan dapat membuat playlist sendiri. Tata letak playlist berupa kolom yang
berurutan sesuai dari jumlah playlist yang ada. Setiap kolom playlist
82
6. Rancangan Halaman Playing Queue
daftar lagu yang telah diputar. Tata letak lagu berupa list yang berurutan sesuai
dari jumlah lagu. Setiap list menampilkan nama artis, dan judul lagu.
halaman Lyrics. Pada halaman Lyrics menampilkan lirik dari lagu yang sedang
83
8. Rancangan Halaman Player
halaman Player. Pada halaman player menampilkan gambar album, judul lagu,
dan duration state. Tombol „A‟ untuk memutar lagu secara acak atau shuffle,
untuk mengulangi lagu atau repeat pengguna memilih tombol „B‟. Untuk memutar
lagu dengan memilih tombol „D‟ atau play, ketika lagu dihentikan akan tombol
„D‟ akan berubah menjadi stop. Untuk memutar lagu sebelumnya dengan memilih
tombol „C‟ atau previous, untuk memutar lagu berikutnya memilih tombol „D‟
atau next.
84
9. Rancangan Halaman Search
halaman Search. Pada halaman Search dapat mencari lagu yang ada dengan
halaman Setting. Pada halaman Setting menampilkan setting pada aplikasi. Tata
letak setting berupa list yang berurutan sesuai dari jumlah setting yang ada. Setiap
85
11. Rancangan Halaman About
Java Development Kit (JDK) dan Java Runtime Environment (JRE), karena
pemrograman Java Development Kit (JDK) dan Java Runtime Environment (JRE)
1. Sistem Operasi
86
2. Sofware Program
3. Software Grafis
keras, maka di butuhkan beberapa perangkat keras, adapun perangkat keras yang
1. Handphone
4. RAM : 512 MB
87
2. Kabel Data Serial Port
3. Laptop
sebagai berikut :
2. VGA : 1Gb
3. RAM : 2Gb
4. Hardisk : 500Gb
4. Bluetooth
Mobile Device.
88
BAB V
IMPLEMENTASI SISTEM
1. MenuLibrary
2. Menu Playlist
89
3. Menu Playing Queue
pemutar musik.
5. Menu Lyrics
6. Menu Setting
7. Menu About
90
Pada halaman Library Song berisikan tentang daftar lagu yang telah
terbaca oleh aplikasi pemutar musik. Tampilan daftar lagu berupa list yang
tersusun perbaris . Jika ingin memutar lagu, pengguna harus memilih lagu
lagu. Tampilan daftar album berupa grid yang tersusun secara baris dan
kolom. Jika album dipilih akan menampilkan lagu yang terdapat pada album
tersebut.
91
5.4 Halaman Library Artis
Pada halaman Library Artis berisikan tentang daftar Artis dari lagu.
Tampilan daftar album berupa grid yang tersusun secara baris dan kolom.
Jika artis dipilih akan menampilkan album dan lagu yang terdapat pada artis
tersebut.
92
Pada halaman Playlist berisikan tentang daftar putar lagu.
Tampilan daftar putar lagu berupa list yang tersusun secara per kolom. Jika
playlist dipilih akan menampilkan lagu yang terdapat pada playlist tersebut.
telah diputar. Tampilan daftar lagu berupa list yang tersusun sesuai urutan
lagu yang diputar. Untuk memutar lagu pada Playing Queue dengan memilih
93
5.7 Halaman Lyrics
library Jsoup untuk mengakses web tanpa melalui browser. Selain untuk
mengakses web tanpa browser Jsoup juga berfungsi untuk membaca semua
94
5.8 Halaman Player
menampilkan judul lagu yang sedang diputar dan progress bar yang
gambar album, beserta tombol – tombol kontrol audio player yang memiliki
1. Tombol Play
menjadi tombol pause ketika lagu dihentikan, jika lagu tombol pause
ditekan maka lagu akan memutar lagi dan tombol pause berubah
2. Tombol Previous
95
Tombol ini berfungi untuk memutar lagu sebelumnya.
3. Tombol Next
4. Tombol Shuffle
5. Tombol Repeat
Tombol ini berfungsi untuk memutar ulang lagu dari awal jika daftar
Library. Dengan mengetikan kata kunci yang terdapat pada seacrh akan
menampilkan Song, Album, dan Artis dari kata kunci yang diketikan.
96
5.10 Halaman Setting
Setting Now Playing untuk mengubah tema Player, Setting Dark Theme
tulisan, setting Start Page untuk mengubah tampilan awal aplikasi, setting
97
5.11 Halaman About
98
BAB VI
berfungsi dengan baik di mana sistem dapat di jalankan sesuai dengan proses
perancangan yang sudah dibuat. Berikut merupakan hasil pengujian yang telah di
lakukan :
apabila tidak ada koneksi internet, maka lirik tidak akan bisa tampil pada aplikasi
dan melakukan pengecekan pada format file lagu, format file lagu yang benar
mempunyai dua id yaitu id artis dan id judul lagu. Jika format file lagu tidak benar
dan tidak memiliki salah satu dari id tersebut, maka lirik tidak akan bisa
ditampilkan. Untuk mengubah file format lagu yang tidak benar harus
ditambahkan, cara menambahkan id dengan mengedit file info, tools edit dapat
Halaman menu pada gambar 6.1 adalah tampilan menu Aplikasi Pemutar
99
1. Menu Library
2. Menu Playlist
musik.
5. Menu Lyrics
6. Menu Setting
7. Menu About
100
Pembahasan :
menampilan menu, jika menu dipilih akan berpindah ke menu yang dipilih :
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
navigationMap.put(Constants.NAVIGATE_LIBRARY, navigateLibrary);
navigationMap.put(Constants.NAVIGATE_PLAYLIST,
navigatePlaylist);
navigationMap.put(Constants.NAVIGATE_QUEUE, navigateQueue);
navigationMap.put(Constants.NAVIGATE_NOWPLAYING,
navigateNowplaying);
navigationMap.put(Constants.NAVIGATE_ALBUM, navigateAlbum);
navigationMap.put(Constants.NAVIGATE_ARTIST, navigateArtist);
mDrawerLayout = (DrawerLayout)
findViewById(R.id.drawer_layout);
panelLayout = (SlidingUpPanelLayout)
findViewById(R.id.sliding_layout);
Pada halaman Library Song berisikan tentang daftar lagu yang telah
terbaca oleh aplikasi pemutar musik. Tampilan daftar lagu berupa list yang
tersusun perbaris . Jika ingin memutar lagu, pengguna harus memilih lagu dari
101
Gambar 6.2 Tampilan Library Song
Pembahasan :
Berikut ItemHolder
public ini adalah onCreateViewHolder(ViewGroup
listing program dari “SongListAdapter.java”
viewGroup, int dalam
i)
{
if (isPlaylist)
menampilkan { yang terdiri dari kumpulan lagu :
Library Song
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item
_song_playlist, null);
ItemHolder ml = new ItemHolder(v);
return ml;
} else {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item
_song, null);
ItemHolder ml = new ItemHolder(v);
return ml;
}
}
102
6.5 Tampilan Library Album
Pada halaman Library Album berisikan tentang daftar Album dari lagu.
Tampilan daftar album berupa grid yang tersusun secara baris dan kolom. Jika
album dipilih akan menampilkan lagu yang terdapat pada album tersebut.
Pembahasan :
103
6.6 Tampilan Album Song
Pembahasan :
menampilan Album Song untuk menampilkan lagu dari album yang dipilh dari
Library Album :
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int
viewType) {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ite
m_album_song, null);
ItemHolder ml = new ItemHolder(v);
return ml;
104
6.7 Tampilan Library Artis
Pada halaman Library Artis berisikan tentang daftar Artis dari lagu.
Tampilan daftar album berupa grid yang tersusun secara baris dan kolom. Jika
artis dipilih akan menampilkan album dan lagu yang terdapat pada artis tersebut.
Pembahasan :
105
6.8 Tampilan Artis Album
Pembahasan :
menampilan Artis Album untuk menampilkan album dari Artis yang dipilih dari
Library Artis :
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.ite
m_artist_album, null);
ItemHolder ml = new ItemHolder(v);
return ml;
}
106
Berikut adalah listing program dari “ArtisSongAdapter.java” dalam
menampilan Artis Album untuk menampilkan lagu dari Artis yang dipilih dari
Library Artis :
Pada halaman Playlist berisikan tentang daftar putar lagu. Tampilan daftar
putar lagu berupa list yang tersusun secara per kolom. Jika playlist dipilih akan
menampilkan lagu yang terdapat pada playlist tersebut. Playlist dapat dibuat
107
Pembahasan :
action = getIntent().getAction();
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_LASTADDED,
playlistLastAdded);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_RECENT,
playlistRecents);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_TOPTRACKS,
playlistToptracks);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_USERCREATED,
playlistUsercreated);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
setAlbumart();
Pada halaman Playing Queue berisikan tentang daftar lagu yang telah
diputar. Tampilan daftar lagu berupa list yang tersusun sesuai urutan lagu yang
diputar. Untuk memutar lagu pada Playing Queue dengan memilih lagu yang ada.
108
Gambar 6.8 Tampilan Playing Queue
Pembahasan :
tampilan lirik berupa teks. Lirik diambil dari website www.azlyrics.com dengan
teknik scraping lirik. Scraping lirik merupakan teknik untuk mencari lirik,
mengambil lirik dan menampilkan lirik. Scraping lirik menggunakan library Jsoup
untuk mengakses web tanpa melalui browser. Selain untuk mengakses web tanpa
browser Jsoup juga berfungsi untuk membaca semua elemen HTML, dan
109
Gambar 6.9 Tampilan Lyrics
Pembahasan :
Jika informasi lagu yang terdiri dari id song, id artis tidak lengkap atau
menampilkan lirik dan muncul pesan “Check Your Input data”. Jika koneksi
internet mati maka akan muncul pesan “Check Your Internet Connection”
try {
AsyncTaskRunner runner = new AsyncTaskRunner();
String htmlArtist = Artist.replaceAll("[\\s'\"-]", "")
.replaceAll("&", "and").replaceAll("[^A-Za-z0-9]",
"");
String htmlSong = Song.replaceAll("[\\s'\"-]", "")
.replaceAll("&", "and").replaceAll("[^A-Za-z0-9]",
"");
String url =
"http://www.azlyrics.com/lyrics/"+htmlArtist.toLowerCase()+"/"+html
Song.toLowerCase()+".html";
runner.execute(url);
judul lagu yang sedang diputar dan progress bar yang menampilkan informasi
progress waktu pada sebuah lagu, menampilkan gambar album, beserta tombol –
1. Tombol Play
menjadi tombol pause ketika lagu dihentikan, jika lagu tombol pause
ditekan maka lagu akan memutar lagi dan tombol pause berubah
2. Tombol Previous
3. Tombol Next
111
4. Tombol Shuffle
5. Tombol Repeat
Tombol ini berfungsi untuk memutar ulang lagu dari awal jika daftar
Pembahasan :
112
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
case R.id.action_settings:
NavigationUtils.navigateToSettings(this);
return true;
case R.id.action_shuffle:
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
MusicPlayer.shuffleAll(BaseActivity.this);
}
}, 80);
return true;
case R.id.action_search:
NavigationUtils.navigateToSearch(this);
return true;
case R.id.action_equalizer:
NavigationUtils.navigateToEqualizer(this);
return true;
6.13 Tampilan Search
}
Pada halaman
return Search berfungsi untuk mencari data
super.onOptionsItemSelected(item); yang ada di Library.
}
Dengan mengetikan kata kunci yang terdapat pada seacrh akan menampilkan
113
Gambar 6.11 Tampilan Search
Pembahasan :
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
mImm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
recyclerView = (RecyclerView)
findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new
LinearLayoutManager(this));
adapter = new SearchAdapter(this);
recyclerView.setAdapter(adapter);
}
114
6.14 Tampilan Setting
Pada halaman Setting berisikan tentang setting pada aplikasi. Setting Now
Playing untuk mengubah tema Player, Setting Dark Theme untuk mengubah tema
menjadi gelap, setting Primary Color untuk mengubah warna tampilan setting
Accent Color untuk mengubah warna tulisan, setting Start Page untuk mengubah
Pembahasan :
menampilkan setting :
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
action = getIntent().getAction();
115
6.15 Tampilan About
Pada halaman About ini berisikan tentang nama aplikasi dan informasi
Pembahasan :
menampilkan about :
setContentView(R.layout.activity_about);
116
BAB VII
PENUTUP
Sebagai penutup dari skripsi yang telah dibuat, pada bab VII berisi tentang
kesimpulan dan saran yang di buat berdasarkan dari penjelasan yang telah di
Penampil Lirik Musik berbasis Android. Semoga dengan adanya kesimpulan dan
saran akan dapat bermanfaat bagi pengguna program pemutar musik dengan
maksimal.
pemecahan masalah yang telah dibahas pada bab-bab sebelumnya, maka dapat
7.1 Kesimpulan
tanpa melalui browser. Selain untuk mengakses web tanpa browser Jsoup
3. Aplikasi Pemutar Musik dapat memutar lagu yang ada dan ditampilkan
117
memutar ulang lagu dengan Repeat, memutar lagu sebelumnya dengan
5. Aplikasi Pemutar Musik dapat memutar acak semua lagu dengan Shuffle
All.
6. Aplikasi Pemutar Musik dapat mengurutkan lagu dengan pilihan yang ada
di Sort By.
7.2 Saran
berikut :
lagu yang benar, jika format tidak benar maka tidak akan bisa
menampilkan lirik.
118
DAFTAR PUSTAKA
– I” pada https://www.academia.edu/9990291/Modul_Programming_
http://dev.xbata.com/smartphone/daur-hidup-life-cycles-activity-class-
Semarang.
Kusuma,R.W. 2013. Aplikasi Location Based Service (LBS) Taman Mini
Informatika. AMIKOM.
Megah Perdana, Eric. 2012. Aplikasi Pencari Lirik Lagu pada Audio Player
Jakarta: Erlangga.
Sora N dalam artikel “Pengertian Audio Dan Media Audio Secara Lengkap” pada
http://www.pengertianku.net/2014/11/pengertian-audio-dan-media-audio-
1. activity_about.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="top"
android:elevation="5dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"/>
</FrameLayout>
2. activity_lyrics.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="top"
android:elevation="5dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"/>
</FrameLayout>
3. activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true">
<android.support.design.widget.NavigationView
android:id="@+id/nav_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:menu="@menu/drawer_view" />
</android.support.v4.widget.DrawerLayout>
4. activity_nowplaying.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
5. activity_playlist_detail.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:id="@+id/blurFrame"
android:transitionName="transition_album_art"/>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/foreground"
android:transitionName="transition_foreground"/>
6. activity_search.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fitsSystemWindows="true"
android:orientation="vertical">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:elevation="5dp" />
<android.support.v7.widget.RecyclerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadeScrollbars="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</LinearLayout>
7. activity_setting.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:layout_gravity="top"
android:elevation="5dp"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
<FrameLayout
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="?attr/actionBarSize"/>
</FrameLayout>
8. album_song_sort_by.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >
<item
android:id="@+id/menu_sort_by"
android:showAsAction="never"
android:orderInCategory="50"
android:title="@string/menu_sort_by">
<menu>
<item
android:id="@+id/menu_sort_by_az"
android:title="@string/sort_order_entry_az"/>
<item
android:id="@+id/menu_sort_by_za"
android:title="@string/sort_order_entry_za"/>
<item
android:id="@+id/menu_sort_by_year"
android:title="@string/sort_order_entry_year"/>
<item
android:id="@+id/menu_sort_by_track_number"
android:title="@string/sort_order_entry_track_number"/>
<item
android:id="@+id/menu_sort_by_duration"
android:title="@string/sort_order_entry_duration"/>
</menu>
</item>
</menu>
9. drawer_view.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group
android:id="@+id/group1"
android:checkableBehavior="single">
<item
android:id="@+id/nav_library"
android:title="@string/library" />
<item
android:id="@+id/nav_playlists"
android:title="@string/playlists" />
<item
android:id="@+id/nav_queue"
android:title="@string/playing_queue" />
<item
android:id="@+id/nav_nowplaying"
android:checkable="false"
android:title="@string/now_playing" />
<item
android:id="@+id/nav_lyrics"
android:title="@string/lyrics" />
</group>
10. menu_main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
tools:context=".MainActivity">
<item android:id="@+id/action_shuffle"
android:title="@string/action_shuffle_all"
android:orderInCategory="10" app:showAsAction="never" />
<item android:id="@+id/action_equalizer"
android:title="@string/action_equalizer"
android:orderInCategory="100" app:showAsAction="never" />
<item android:id="@+id/action_settings"
android:title="@string/action_settings"
android:orderInCategory="101" app:showAsAction="never" />
<item
android:id="@+id/action_search"
android:orderInCategory="1"
android:icon="@drawable/ic_action_search"
app:showAsAction="always"
android:title="@string/search"/>
</menu>
11. menu_playlist.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_new_playlist"
android:orderInCategory="9"
android:title="New playlist"
app:showAsAction="never" />
</menu>
12. menu_search.xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_search"
android:icon="@drawable/ic_action_search"
android:orderInCategory="1"
app:actionViewClass="android.support.v7.widget.SearchView"
app:showAsAction="ifRoom|collapseActionView"
android:title="@string/search"/>
</menu>
B. Listing Program Java
1. AboutActivity.java
package com.player.musiclyrics.activities;
public class AboutActivity extends BaseThemedActivity implements
ColorChooserDialog.ColorCallback, ATEActivityThemeCustomizer {
String action;
@Override
public void onCreate(Bundle savedInstanceState) {
if
(PreferencesUtility.getInstance(this).getTheme().equals("dark"))
setTheme(R.style.AppThemeNormalDark);
else if
(PreferencesUtility.getInstance(this).getTheme().equals("black"))
setTheme(R.style.AppThemeNormalBlack);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about);
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@StyleRes
@Override
public int getActivityTheme() {
return
PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_them
e", false) ?
R.style.AppThemeDark : R.style.AppThemeLight;
}
@Override
public void onColorSelection(@NonNull ColorChooserDialog dialog,
@ColorInt int selectedColor) {
final Config config = ATE.config(this, getATEKey());
switch (dialog.getTitle()) {
case R.string.primary_color:
config.primaryColor(selectedColor);
break;
case R.string.accent_color:
config.accentColor(selectedColor);
break;
}
config.commit();
recreate();
}
2. BaseActivity.java
package com.player.musiclyrics.activities;
public class BaseActivity extends ATEActivity implements
ServiceConnection, MusicStateListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@Override
protected void onStart() {
super.onStart();
registerReceiver(mPlaybackStatus, filter);
}
@Override
protected void onStop() {
super.onStop();
@Override
public void onResume() {
super.onResume();
onMetaChanged();
}
@Override
protected void onDestroy() {
super.onDestroy();
// Unbind from the service
if (mToken != null) {
MusicPlayer.unbindFromService(mToken);
mToken = null;
}
try {
unregisterReceiver(mPlaybackStatus);
} catch (final Throwable e) {
}
mMusicStateListener.clear();
return true;
case R.id.action_search:
NavigationUtils.navigateToSearch(this);
return true;
case R.id.action_equalizer:
NavigationUtils.navigateToEqualizer(this);
return true;
}
return super.onOptionsItemSelected(item);
}
3. LyricsActivity.java
package com.player.musiclyrics.activities;
public class LyricsActivity extends BaseThemedActivity implements
ColorChooserDialog.ColorCallback, ATEActivityThemeCustomizer {
String action;
@Override
public void onCreate(Bundle savedInstanceState) {
if
(PreferencesUtility.getInstance(this).getTheme().equals("dark"))
setTheme(R.style.AppThemeNormalDark);
else if
(PreferencesUtility.getInstance(this).getTheme().equals("black"))
setTheme(R.style.AppThemeNormalBlack);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lyrics);
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@StyleRes
@Override
public int getActivityTheme() {
return
PreferenceManager.getDefaultSharedPreferences(this).getBoolean("dark_them
e", false) ?
R.style.AppThemeDark : R.style.AppThemeLight;
}
@Override
public void onColorSelection(@NonNull ColorChooserDialog dialog,
@ColorInt int selectedColor) {
final Config config = ATE.config(this, getATEKey());
switch (dialog.getTitle()) {
case R.string.primary_color:
config.primaryColor(selectedColor);
break;
case R.string.accent_color:
config.accentColor(selectedColor);
break;
}
config.commit();
recreate(); }
4. LyricsFragment.java
package com.player.musiclyrics.fragments;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup
container, Bundle savedInstanceState) {
View rootView = inflater.inflate(
R.layout.fragment_lyrics, container, false);
swipeView = (SwipeRefreshLayout)
rootView.findViewById(R.id.swipe_view);
swipeView.setOnRefreshListener(this);
swipeView.setColorSchemeColors(R.color.colorAccent,
R.color.colorAccentDarkTheme, R.color.colorAccentDarkDefault);
swipeView.setDistanceToTriggerSync(20);// in dips
swipeView.setSize(SwipeRefreshLayout.DEFAULT);// LARGE also can
be used
Artist = MusicPlayer.getArtistName();
Song = MusicPlayer.getTrackName();
Typeface myTypeface =
Typeface.createFromAsset(getActivity().getAssets(), "materialdesignicons-
webfont.ttf");
lrcView = (TextView) rootView.findViewById(R.id.lrc_view);
lrcView.setTypeface(myTypeface);
swipeView.setRefreshing(true);
swipeView.post(new Runnable() {
@Override
public void run() {
loadLyrics();
swipeView.setRefreshing(false);
}
});
return rootView;
}
try {
AsyncTaskRunner runner = new AsyncTaskRunner();
String htmlArtist = Artist.replaceAll("[\\s'\"-]", "")
.replaceAll("&", "and").replaceAll("[^A-Za-z0-9]",
"");
String htmlSong = Song.replaceAll("[\\s'\"-]", "")
.replaceAll("&", "and").replaceAll("[^A-Za-z0-9]",
"");
String url =
"http://www.azlyrics.com/lyrics/"+htmlArtist.toLowerCase()+"/"+htmlSong.t
oLowerCase()+".html";
runner.execute(url);
}catch (Exception e){
getActivity().finish();
Toast.makeText(getActivity(), "Please select song first "+e,
Toast.LENGTH_LONG).show();
//output = "Check your internet connection";
}
}
@Override
protected String doInBackground(String... params) {
String url = params[0];
try {
Document document = Jsoup.connect(url)
.userAgent("Mozilla").get();
document.outputSettings(new
Document.OutputSettings().prettyPrint(false));
document.select("br").append("\\n");
Elements lyrics = document.select("b + br + br + div");
String s = lyrics.html().replaceAll("\\\\n", "\n");
output = Jsoup.clean(s, "", Whitelist.none(), new
Document.OutputSettings().prettyPrint(false));
output = output.replace("\n\n", "\n");
output = output.substring(4);
} catch (HttpStatusException e) {
output = "Check your input data";
Log.d("LyricFinder", e.toString());
} catch (Exception e) {
System.err.println("Some error: " + e);
output = "Check your internet connection";
Log.d("LyricFinder", e.toString());
}
return output;
}
@Override
protected void onPostExecute(String result) {
lrcView.setText(result);
}
@Override
protected void onPreExecute() {
}
@Override
protected void onProgressUpdate(String... text) {
}
}
}
5. MainActivity.java
package com.player.musiclyrics.activities;
public class MainActivity extends BaseActivity implements
ATEActivityThemeCustomizer {
navigationView.getMenu().findItem(R.id.nav_library).setChecked(true);
Fragment fragment = new MainFragment();
FragmentTransaction transaction =
getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container,
fragment).commitAllowingStateLoss();
}
};
Runnable navigateNowplaying = new Runnable() {
Runnable navigateArtist = new Runnable() {
public void run() {
long artistID =
getIntent().getExtras().getLong(Constants.ARTIST_ID);
Fragment fragment =
ArtistDetailFragment.newInstance(artistID, false, null);
FragmentManager fragmentManager =
getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment).commit();
}
};
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home: {
if (isNavigatingMain()) {
mDrawerLayout.openDrawer(GravityCompat.START);
} else super.onBackPressed();
return true;
}
}
return super.onOptionsItemSelected(item);
}
switch (menuItem.getItemId()) {
case R.id.nav_library:
runnable = navigateLibrary;
break;
case R.id.nav_playlists:
runnable = navigatePlaylist;
break;
case R.id.nav_nowplaying:
NavigationUtils.navigateToNowplaying(MainActivity.this,
false);
break;
case R.id.nav_queue:
runnable = navigateQueue;
break;
case R.id.nav_lyrics:
NavigationUtils.navigateToLyrics(MainActivity.this);
break;
case R.id.nav_settings:
NavigationUtils.navigateToSettings(MainActivity.this);
break;
case R.id.nav_about:
NavigationUtils.navigateToAbout(MainActivity.this);
break;
}
public void setDetailsToHeader() {
String name = MusicPlayer.getTrackName();
String artist = MusicPlayer.getArtistName();
@Override
public void onMetaChanged() {
super.onMetaChanged();
setDetailsToHeader();
}
@Override
public void onResume() {
super.onResume();
sMainActivity = this;
}
}
6. PlaylistDetailActivity.java
package com.player.musiclyrics.activities;
public class PlaylistDetailActivity extends BaseThemedActivity implements
ATEActivityThemeCustomizer {
String action;
long playlistID;
HashMap<String, Runnable> playlistsMap = new HashMap<>();
Runnable playlistLastAdded = new Runnable() {
public void run() {
new loadLastAdded().execute("");
}
};
Runnable playlistRecents = new Runnable() {
@Override
public void run() {
new loadRecentlyPlayed().execute("");
}
};
Runnable playlistToptracks = new Runnable() {
@Override
public void run() {
new loadTopTracks().execute("");
}
};
Runnable playlistUsercreated = new Runnable() {
@Override
public void run() {
new loadUserCreatedPlaylist().execute("");
}
};
private AppCompatActivity mContext = PlaylistDetailActivity.this;
private SongsListAdapter mAdapter;
private RecyclerView recyclerView;
private ImageView blurFrame;
private TextView playlistname;
private View foreground;
@TargetApi(21)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_playlist_detail);
action = getIntent().getAction();
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_LASTADDED,
playlistLastAdded);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_RECENT,
playlistRecents);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_TOPTRACKS,
playlistToptracks);
playlistsMap.put(Constants.NAVIGATE_PLAYLIST_USERCREATED,
playlistUsercreated);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
setAlbumart();
if (MusiclyricsUtils.isLollipop() &&
PreferencesUtility.getInstance(this).getAnimations()) {
getWindow().getEnterTransition().addListener(new
EnterTransitionListener());
} else {
setUpSongs();
}
7. SearchActivity.java
package com.player.musiclyrics.activities;
public class SearchActivity extends BaseThemedActivity implements
SearchView.OnQueryTextListener, View.OnTouchListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
mImm = (InputMethodManager)
getSystemService(Context.INPUT_METHOD_SERVICE);
@Override
public boolean onCreateOptionsMenu(final Menu menu) {
getMenuInflater().inflate(R.menu.menu_search, menu);
mSearchView = (SearchView)
MenuItemCompat.getActionView(menu.findItem(R.id.menu_search));
mSearchView.setOnQueryTextListener(this);
mSearchView.setQueryHint(getString(R.string.search_library));
mSearchView.setIconifiedByDefault(false);
mSearchView.setIconified(false);
MenuItemCompat.setOnActionExpandListener(menu.findItem(R.id.menu_search),
new MenuItemCompat.OnActionExpandListener() {
@Override
public boolean onMenuItemActionExpand(MenuItem item) {
return true;
}
@Override
public boolean onMenuItemActionCollapse(MenuItem item) {
finish();
return false;
}
});
menu.findItem(R.id.menu_search).expandActionView();
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
8. SettingActivity.java
package com.player.musiclyrics.activities;
public class SettingsActivity extends BaseThemedActivity implements
ColorChooserDialog.ColorCallback, ATEActivityThemeCustomizer {
String action;
@Override
public void onCreate(Bundle savedInstanceState) {
if
(PreferencesUtility.getInstance(this).getTheme().equals("dark"))
setTheme(R.style.AppThemeNormalDark);
else if
(PreferencesUtility.getInstance(this).getTheme().equals("black"))
setTheme(R.style.AppThemeNormalBlack);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_settings);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
action = getIntent().getAction();
if (action.equals(Constants.SETTINGS_STYLE_SELECTOR)) {
getSupportActionBar().setTitle(R.string.now_playing);
String what =
getIntent().getExtras().getString(Constants.SETTINGS_STYLE_SELECTOR_WHAT)
;
Fragment fragment = StyleSelectorFragment.newInstance(what);
FragmentManager fragmentManager =
getSupportFragmentManager();
fragmentManager.beginTransaction()
.add(R.id.fragment_container, fragment).commit();
} else {
getSupportActionBar().setTitle(R.string.settings);
PreferenceFragment fragment = new SettingsFragment();
android.app.FragmentManager fragmentManager =
getFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.fragment_container, fragment).commit();
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
default:
break;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onColorSelection(@NonNull ColorChooserDialog dialog,
@ColorInt int selectedColor) {
final Config config = ATE.config(this, getATEKey());
switch (dialog.getTitle()) {
case R.string.primary_color:
config.primaryColor(selectedColor);
break;
case R.string.accent_color:
config.accentColor(selectedColor);
break;
}
config.commit();
recreate();
9. AlbumAdapter.java
public class AlbumAdapter extends
RecyclerView.Adapter<AlbumAdapter.ItemHolder> {
}
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
if (isGrid) {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_album_g
rid, null);
ItemHolder ml = new ItemHolder(v);
return ml;
} else {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_album_l
ist, null);
ItemHolder ml = new ItemHolder(v);
return ml;
}
}
@Override
public int getItemCount() {
return (null != arraylist ? arraylist.size() : 0);
}
@Override
public void onClick(View v) {
NavigationUtils.navigateToAlbum(mContext,
arraylist.get(getAdapterPosition()).id,
new Pair<View, String>(albumArt,
"transition_album_art" + getAdapterPosition()));
}
10. AlbumSongAdapter.java
package com.player.musiclyrics.adapters;
public class AlbumSongsAdapter extends
RecyclerView.Adapter<AlbumSongsAdapter.ItemHolder> {
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int
viewType) {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_album_s
ong, null);
ItemHolder ml = new ItemHolder(v);
return ml;
}
@Override
public void onClick(View v) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
MusicPlayer.playAll(mContext, songIDs,
getAdapterPosition(), albumID, MusiclyricsUtils.IdType.Album, false);
NavigationUtils.navigateToNowplaying(mContext, true);
}
11. ArtistAdapter.java
package com.player.musiclyrics.adapters;
@Override
public void onBindViewHolder(final ItemHolder itemHolder, int i) {
final Artist localItem = arraylist.get(i);
itemHolder.name.setText(localItem.name);
String albumNmber = MusiclyricsUtils.makeLabel(mContext,
R.plurals.Nalbums, localItem.albumCount);
String songCount = MusiclyricsUtils.makeLabel(mContext,
R.plurals.Nsongs, localItem.songCount);
itemHolder.albums.setText(MusiclyricsUtils.makeCombinedString(mContext,
albumNmber, songCount));
public class ItemHolder extends RecyclerView.ViewHolder implements
View.OnClickListener {
protected TextView name, albums;
protected ImageView artistImage;
protected View footer;
@Override
public void onClick(View v) {
NavigationUtils.navigateToArtist(mContext,
arraylist.get(getAdapterPosition()).id,
new Pair<View, String>(artistImage,
"transition_artist_art" + getAdapterPosition()));
}
}
}
12. ArtistAlbumAdapter.java
package com.player.musiclyrics.adapters;
public class ArtistAlbumAdapter extends
RecyclerView.Adapter<ArtistAlbumAdapter.ItemHolder> {
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_artist_
album, null);
ItemHolder ml = new ItemHolder(v);
return ml;
}
@Override
public void onBindViewHolder(ItemHolder itemHolder, int i) {
itemHolder.title.setText(localItem.title);
String songCount = MusiclyricsUtils.makeLabel(mContext,
R.plurals.Nsongs, localItem.songCount);
itemHolder.details.setText(songCount);
ImageLoader.getInstance().displayImage(MusiclyricsUtils.getAlbumArtUri(lo
calItem.id).toString(), itemHolder.albumArt,
new DisplayImageOptions.Builder().cacheInMemory(true)
.showImageOnFail(R.drawable.ic_empty_music2)
.resetViewBeforeLoading(true)
.build());
if (MusiclyricsUtils.isLollipop())
itemHolder.albumArt.setTransitionName("transition_album_art"
+ i);
@Override
public int getItemCount() {
return (null != arraylist ? arraylist.size() : 0);
}
@Override
public void onClick(View v) {
NavigationUtils.navigateToAlbum(mContext,
arraylist.get(getAdapterPosition()).id,
new Pair<View, String>(albumArt,
"transition_album_art" + getAdapterPosition()));
}
}
}
13. ArtistSongAdapter.java
package com.player.musiclyrics.adapters;
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int
viewType) {
if (viewType == 0) {
View v0 =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.artist_detai
l_albums_header, null);
ItemHolder ml = new ItemHolder(v0);
return ml;
} else {
View v2 =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_artist_
song, null);
ItemHolder ml = new ItemHolder(v2);
return ml;
}
}
this.albumsRecyclerView = (RecyclerView)
view.findViewById(R.id.recycler_view_album);
@Override
public void getItemOffsets(Rect outRect, View view,
RecyclerView parent,
RecyclerView.State state) {
14. PlayingQueueAdapter.java
package com.player.musiclyrics.adapters;
public class PlayingQueueAdapter extends
RecyclerView.Adapter<PlayingQueueAdapter.ItemHolder> {
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_playing
_queue, null);
ItemHolder ml = new ItemHolder(v);
return ml;
}
@Override
public int getItemCount() {
return (null != arraylist ? arraylist.size() : 0);
}
return ret;
}
@Override
public void onClick(View v) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
MusicPlayer.setQueuePosition(getAdapterPosition());
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
@Override
public void run() {
notifyItemChanged(currentlyPlayingPosition);
notifyItemChanged(getAdapterPosition());
}
15. SongListAdapter.java
package com.player.musiclyrics.adapters;
public class SongsListAdapter extends
RecyclerView.Adapter<SongsListAdapter.ItemHolder> implements
BubbleTextGetter {
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
if (isPlaylist) {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_song_pl
aylist, null);
ItemHolder ml = new ItemHolder(v);
return ml;
} else {
View v =
LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_song,
null);
ItemHolder ml = new ItemHolder(v);
return ml;
}
}
public class ItemHolder extends RecyclerView.ViewHolder implements
View.OnClickListener {
protected TextView title, artist;
protected ImageView albumArt, popupMenu;
private MusicVisualizer visualizer;
@Override
public void onClick(View v) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
MusicPlayer.playAll(mContext, songIDs,
getAdapterPosition(), -1, MusiclyricsUtils.IdType.NA, false);
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
@Override
public void run() {
notifyItemChanged(currentlyPlayingPosition);
notifyItemChanged(getAdapterPosition());
}
16. MusicPlayer.java
package com.player.musiclyrics;
public class MusicPlayer {
static {
mConnectionMap = new WeakHashMap<Context, ServiceBinder>();
sEmptyList = new long[0];
}
mService.setRepeatMode(MusicService.REPEAT_CURRENT);
if (mService.getShuffleMode() !=
MusicService.SHUFFLE_NONE) {
mService.setShuffleMode(MusicService.SHUFFLE_NONE);
}
break;
default:
mService.setRepeatMode(MusicService.REPEAT_NONE);
break;
}
}
} catch (final RemoteException ignored) {
}
}
public static void playArtist(final Context context, final long
artistId, int position, boolean shuffle) {
final long[] artistList = getSongListForArtist(context,
artistId);
if (artistList != null) {
playAll(context, artistList, position, artistId,
IdType.Artist, shuffle);
}
}