KERJA PRAKTIK – IF184801
Implementasi Aplikasi Monitoring Kinerja FTEIC
ITS berbasis Android
Fakultas Teknologi Elektro dan Informatika Cerdas – ITS
Surabaya
Gedung Rektorat Lt.3 Kampus ITS Sukolilo Surabaya
Periode: 1 Agustus 2020 – 31 Oktober 2020
Oleh:
M. Rafi Fadhilah
05111740000075
Pembimbing Jurusan
Waskitho Wibisono, S.Kom., M.Eng., Ph.D
Pembimbing Lapangan
Dr. I Ketut Eddy Purnama, S.T., M.T.
DEPARTEMEN TEKNIK INFORMATIKA
Fakultas Teknologi Elektro dan Informatika Cerdas
Institut Teknologi Sepuluh Nopember
KERJA PRAKTIK – IF184801
Implementasi Aplikasi Monitoring Kinerja FTEIC
ITS berbasis Android
Fakultas Teknologi Elektro dan Informatika
Cerdas – ITS Surabaya
Gedung Rektorat Lt.3 Kampus ITS Sukolilo
Surabaya
Periode: 1 Agustus 2020 – 31 Oktober 2020
Oleh:
M. Rafi Fadhilah
05111740000075
Pembimbing Jurusan
Waskitho Wibisono, S.Kom., M.Eng., Ph.D
Pembimbing Lapangan
Dr. I Ketut Eddy Purnama, S.T., M.T.
DEPARTEMEN INFORMATIKA
Fakultas Teknologi Informasi dan Komunikasi
Institut Teknologi Sepuluh Nopember
LEMBAR PENGESAHAN
KERJA PRAKTIK
Implementasi Aplikasi Monitoring Kinerja FTEIC
ITS berbasis Android
Oleh:
M. Rafi Fadhilah
05111740000075
Disetujui oleh Pembimbing Kerja Praktik:
1. Waskitho Wibisono, S.Kom., M.Eng., Ph.D
.
NIP. 197512202001122002
(Pembimbing Departemen)
2. Dr. I Ketut Eddy Purnama, S.T., M.T.
NIP. 196907301995121001
Implementasi Aplikasi Monitoring Kinerja FTEIC ITS berbasis
Android
Nama Mahasiswa
: M. Rafi Fadhilah
NRP
: 05111740000075
Departemen
: Informatika FTEIC-ITS
Pembimbing Jurusan : Waskitho Wibisono, S.Kom., M.Eng.,
Ph.D.
A
BSTRAK
Dosen serta tenaga kependidikan di Fakultas Teknologi
Elektro dan Informatika Cerdas memilki track record yang sangat
banyak tiap tahunnya. Mulai dari prestasi, kuliah tamu, training,
sertifikasi, konferensi dan jurnal. Karena masalah tersebut, diperlukan
adanya suatu sistem informasi untuk menampung semua catatan yang
ada agar data yang tersimpan dapat digunakan dengan lebih baik.
Sehingga perlu dibangun aplikasi untuk melakukan
monitoring terhadap kinerja yang telah dilakukan terhadap semua
kegiatan yang terjadi di FTEIC. Aplikasi ini mampu untuk melakukan
proses administratif sekaligus melakukan masukan setiap catatan pada
kategorinya masing-masing.
Pembuatan aplikasi menggunakan beberapa framework.
Untuk pembuatan aplikasi menggunakan Android Studio sebagai IDE
dengan bahasa pemrograman Kotlin. Lalu untuk backend
menggunakan Django. basis data yang digunakan adalah MySQL.
Kata kunci:
KATA PENGANTAR
Puji dan syukur penulis panjatkan kepada Tuhan Yang Maha
Esa karena atas berkat limpahan rahmat dan lindungan-Nya penulis
dapat melaksanakan salah satu kewajiban sebagai mahasiswa Teknik
Informatika ITS yaitu Kerja Praktik (KP).
Penulis menyadari masih terdapat banyak kekurangan baik
dalam pelaksanaan kerja praktik maupun penyusunan buku laporan
ini, namun kami berharap buku laporan ini dapat menambah wawasan
pembaca dan dapat menjadi sumber referensi. Penulis mengharapkan
kritik dan saran yang membangun untuk kesempurnaan penulisan
buku laporan ini.
Melalui laporan ini penulis juga ingin menyampaikan rasa
terima kasih kepada kepada orang-orang yang telah membantu dalam
pelaksanaan kerja praktik hingga penyusunan laporan Kerja praktik
baik secara langsung maupun tidak langsung. Orang-orang tersebut
antara lain adalah:
1. Orang tua penulis,
2. Bapak Waskitho Wibisono, S.Kom., M.Eng., Ph.D. selaku
dosen pembimbing kerja praktik yang telah membimbing
penulis selama kerja praktik berlangsung.
3. Bapak Ary Mazharuddin Shiddiqi, S.Kom., M.Comp.Sc.,
Ph.D selaku koordinator Kerja Praktik.
4. Bapak Dr. I Ketut Eddy Purnama, S.T., M.T. selaku
pembimbing lapangan selama kerja praktik yang telah
memberikan bimbingan serta ilmunya kepada penulis.
Surabaya, Januari 2021
DAFTAR
ISI
VII
KATA PENGANTARIX
DAFTAR ISIXI
DAFTAR GAMBARXVII
DAFTAR TABELXIX
DAFTAR KODE SUMBERXXI
BAB I PENDAHULUAN1
1.1. L
ATARB
ELAKANG1
1.2. T
UJUAN1
1.3. 1
1.4. 1
1.5. 2
1.6. 2
1.6.1.
2
1.6.2.
2
1.6.3.
2
1.6.4.
3
1.6.5.
3
1.7. 3
1.7.1.
3
1.7.2.
Bab II: Profil Instansi3
1.7.3.
Bab III: Tinjauan Pustaka3
1.7.4.
4
1.7.5.
4
1.7.6.
4
BAB II PROFIL INSTANSI5
2.2. S
TRUKTURO
RGANISASI5
2.3. L
OKASII
NSTANSI6
7
3.1. A7
3.2. P
YTHON7
3.3. D
JANGO7
3.4. J
AVAS
CRIPT8
3.5. HTML8
3.6. 8
3.7. W
EBS
ERVER8
3.8. A
NDROIDS
TUDIO8
10
4.1 I
MPLEMENTASIS
ISTEM10
4.2
I
MPLEMENTASIT
AMPILANH
ALAMAN10
4.2.1.
10
4.2.2.
14
4.2.3.
Menampilkan Halaman Kuliah Tamu22
4.2.4.
28
4.2.5.
49
4.2.6.
60
4.2.7.
68
4.2.8.
75
4.2.9.
81
4.2.10. 84
4.2.11. 88
4.2.12. 93
4.2.13. 105
4.2.14. 112
4.3
I
MPLEMENTASIA
NDROIDC
OMPONENT119
4.3.1.
119
4.3.2.
123
4.3.3.
126
4.3.4.
129
4.3.5.
133
4.3.6.
136
4.3.7.
138
142
5.1. 142
5.1.1.
142
5.1.2.
142
5.1.3.
142
5.1.4.
142
5.1.5.
143
5.1.6.
143
5.1.7.
143
5.1.8.
144
5.1.9.
144
5.1.10. 144
5.1.11. 145
5.1.12. 145
5.1.13. 145
5.1.14. 146
5.1.15. 146
5.1.16. 146
5.1.17. 147
5.1.18. 147
5.1.19. 147
5.1.20. 148
5.1.21. 148
5.1.22. 148
5.1.23. 149
5.1.24. 149
5.1.25. 150
5.1.26. 150
5.1.27. 150
5.1.28. 151
5.1.29. 151
5.2. 151
5.2.1.
157
5.2.2.
158
5.2.3.
159
5.2.4.
160
5.2.5.
161
5.2.6.
162
5.2.7.
163
5.2.8.
164
5.2.9.
165
5.2.10. 166
5.2.11. 167
5.2.12. 168
5.2.13. 169
5.2.14. 170
5.2.15. 171
5.2.16. 172
5.2.17. 173
5.2.18. 174
5.2.19. 175
5.2.20. 176
5.2.21. 177
5.2.22. 178
5.2.23. 179
5.2.24. 180
5.2.25. 181
5.2.26. 182
5.2.27. 183
186
186
186
187
189
DAFTAR
GAMBAR
Gambar 5.1: Tampilan hasil uji coba login pengguna158
Gambar 5.2: Tampilan hasil uji coba logout pengguna159
Gambar 5.3: Tampilan hasil uji coba membuka halaman kuliah
tamu160
Gambar 5.4: Tampilan hasil uji coba melihat halaman detail kuliah
tamu161
Gambar 5.5: Tampilan hasil uji coba menghapus kuliah tamu162
Gambar 5.6: Tampilan hasil uji coba memvalidasi kuliah tamu163
Gambar 5.7: Tampilan hasil uji coba membuka halaman konferensi /
jurnal164
Gambar 5.8: Tampilan hasil uji coba membuka halaman detail
konferensi / jurnal165
Gambar 5.9: Tampilan hasil uji coba menghapus konferensi /
jurnal166
Gambar 5.10 Tampilan hasil uji coba memvalidasi konferensi /
jurnal167
Gambar 5.11: Tampilan hasil uji coba membuka halaman prestasi
dosen168
Gambar 5.12: Tampilan hasil uji coba membuka halaman detail
prestasi dosen169
Gambar 5.13: Tampilan hasil uji coba menghapus prestasi dosen170
Gambar 5.14: Tampilan hasil uji coba memvalidasi prestasi dosen171
Gambar 5.15: Tampilan hasil uji coba membuka halaman training172
Gambar 5.16: Tampilan hasil uji coba membuka halaman detail
training173
Gambar 5.17: Tampilan hasil uji coba menghapus training174
Gambar 5.18: Tampilan hasil uji coba memvalidasi training175
Gambar 5.19: Tampilan hasil uji coba membuka halaman
sertifikasi176
Gambar 5.20: Tampilan hasil uji coba membuka halaman detail
sertifikasi177
Gambar 5.22: Tampilan hasil uji coba memvalidasi sertifikasi179
Gambar 5.23: Tampilan hasil uji coba mengubah kata sandi180
Gambar 5.24: Tampilan hasil uji coba membuka halaman
submission181
Gambar 5.25: Tampilan hasil uji coba membuka halaman
submission182
Gambar 5.26: Tampilan hasil uji coba membuka halaman
download183
DAFTAR
TABEL
DAFTAR
KODE
SUMBER
Kode Sumber 4.1: Dependensi Halaman Login11
Kode Sumber 4.2: Kode Sumber Halaman Login14
Kode Sumber 4.3: Dependensi Halaman Dashboard15
Kode Sumber 4.4: Kode Sumber Halaman Dashboard21
Kode Sumber 4.5: Dependensi Halaman Kuliah Tamu22
Kode Sumber 4.6: Kode Sumber Halaman Kuliah Tamu28
Kode Sumber 4.7: Dependensi Halaman Konferensi / Jurnal29
Kode Sumber 4.8: Kode Sumber Halaman Konferensi / Jurnal49
Kode Sumber 4.9: Dependensi Halaman Prestasi Dosen50
Kode Sumber 4.10: Kode Sumber Halaman Prestasi Dosen60
Kode Sumber 4.11: Dependensi Halaman Training61
Kode Sumber 4.12: Kode Sumber Halaman Training68
Kode Sumber 4.13: Dependensi Halaman Sertifikasi69
Kode Sumber 4.14: Kode Sumber Halaman Sertifikasi75
Kode Sumber 4.15: Dependensi Halaman Submission76
Kode Sumber 4.16: Kode Sumber Halaman Submission81
Kode Sumber 4.17: Dependensi Halaman Ubah Password82
Kode Sumber 4.18: Kode Sumber Halaman Ubah Password84
Kode Sumber 4.19: Dependensi Halaman Download84
Kode Sumber 4.20: Kode Sumber Halaman Download88
Kode Sumber 4.21: Dependensi Halaman Detail Training89
Kode Sumber 4.22: Kode Sumber Halaman Detail Training93
Kode Sumber 4.23: Dependensi Halaman Detail Konferensi / Jurnal94
Kode Sumber 4.24: Kode Sumber Halaman Detail Konferensi atau
Jurnal104
Kode Sumber 4.25: Dependensi Halaman Detail Prestasi105
Kode Sumber 4.26: Kode Sumber Halaman Detail112
Kode Sumber 4.27: Dependensi Halaman Detail Sertifikasi113
Kode Sumber 4.28: Kode Sumber Halaman Detail Sertifikasi118
Kode Sumber 4.29: Dependensi Komponen Adapter Prestasi119
Kode Sumber 4.30: Kode Sumber Komponen Adapter Prestasi122
Kode Sumber 4.31: Dependensi Komponen Adapter Konferensi123
Kode Sumber 4.32: Kode Sumber Komponen Adapter Konferensi126
Kode Sumber 4.33: Dependensi Komponen Adapter Jurnal127
Kode Sumber 4.34: Kode Sumber Komponen Adapter Jurnal129
Kode Sumber 4.35: Dependensi Komponen Adapter Submission130
Kode Sumber 4.36: Kode Sumber Komponen Adapter Submission132
Kode Sumber 4.37: Dependensi Komponen Adapter Kuliah Tamu133
Kode Sumber 4.38: Kode Sumber Komponen Adapter Kuliah
Tamu135
Kode Sumber 4.39: Dependensi Komponen Adapter Training136
Kode Sumber 4.40: Kode Sumber Komponen Adapter Training138
Kode Sumber 4.41: Dependensi Komponen Adapter Sertifikasi139
Kode Sumber 4.42: Kode Sumber Komponen Adapter Sertifikasi141
BAB
I
PENDAHULUAN
1.1.
Latar Belakang
Dari waktu ke waktu, setiap kegiatan yang dilaksanakan di
Fakultas Teknologi Elektro dan Informatika Cerdas tidak tercatat
dengan baik. Akibatnya, pencarian kegiatan-kegiatan tersebut sulit
dilakukan di waktu mendatang.
Masalah tersebut memunculkan ide untuk membangun sebuah
aplikasi untuk melakukan pengawasan terhadap seluruh catatan yang
dapat disajikan secara terperinci dan terstruktur.
Aplikasi ini akan mengelompokkan kegiatan berdasarkan
kategorinya dan untuk setiap kategori dapat diurutkan berdasarkan
tahun, departemen, dan detil kegiatan lainnya.
1.2.
Tujuan
Tujuan Kerja praktik kali ini adalah melakukan implementasi
aplikasi monitoring kinerja FTEIC ITS sekaligus menuntaskan
kewajiban kuliah kerja praktik di Institut Teknologi Sepuluh
Nopember.
1.3.
Manfaat
Manfaat dari implementasi aplikasi ini adalah memudahkan
pencarian dan penyortiran catatan kegiatan yang ada pada FTEIC ITS
yang akan berguna di waktu yang akan datang.
1.4.
Rumusan Permasalahan
Berikut rumusan masalah dalam pelaksanaan kerja praktik
implementasi aplikasi monitoring kinerja FTEIC ITS berbasis
Android:
● Bagaimana membangun aplikasi monitoring kinerja FTEIC ITS
berbasis android?
● Bagaimana mengelola aplikasi monitoring kinerja FTEIC ITS
berbasis android agar lebih fleksibel dan optimal?
1.5.
Lokasi dan Waktu Kerja Praktik
Kerja praktik kali ini dilaksanakan pada waktu dan
tempat sebagai berikut:
Lokasi
: Online
Alamat
: Perumdos Blok U no. 169, Kampus Sukolilo ITS
Surabaya
Waktu
: 1 Oktober 2020 – 31 Desember 2020
Hari Kerja
: Setiap Hari
Jam kerja
: Fleksibel
1.6.
Metodologi Kerja Praktik
1.6.1. Perumusan Masalah
Untuk mengetahui domain dan fungsionalitas, dijelaskan secara rinci
bagaimana sistem yang harus dibuat. Penjelasan oleh pembimbing
lapangan kerja praktik kali ini menghasilkan beberapa catatan
mengenai gambaran secara garis besar tentang sistem berbasis android
yang sebelumnya telah diterapkan. Setelah mendapatkan gambaran
sistem, diskusi lebih lanjut dilakukan guna menentukan rancangan
serta tools pendukung pembuatan sistem.
1.6.2. Studi Literatur
Pada tahap ini, setelah ditentukannya rancangan database, bahasa
pemrograman sampai dengan teknologi beserta tools tambahan yang
digunakan, dilakukan studi literatur lanjut mengenai bagaimana
penggunaannya dalam membangun sistem sesuai yang diharapkan.
Dikarenakan aplikasi yang akan dibuat merupakan bagian dari sistem
yang sudah terbangun, maka secara garis besar tools yang digunakan
juga tidak jauh berbeda. Bahasa pemrograman yang digunakan Python
untuk backend dan web server, dengan bantuan kerangka kerja
(framework) Django. Kemudian untuk aplikasi android menggunakan
Kotlin sebagai bahasa pemrograman.
1.6.3. Analisis dan Perancangan Sistem
Langkah ini meliputi penjelasan awal tentang sistem. Bagaimana cara
kerja sistem dengan skenario tertentu. Dari penjelasan awal telah
didapatkan beberapa kebutuhan fungsional secara garis besar.
Kemudian dilanjutkan dengan memperjelas dan menspesifikkan
kebutuhan- kebutuhan tersebut.
1.6.4. Implementasi Sistem
Implementasi sistem didasarkan oleh perancangan dan analisis
sebelumnya. Semua didasari pada rancangan yang sudah ada
sebelumnya dan penentuan tools yang telah dilakukan sebelumnya.
Penentuan tipe data saat pembuatan table baru pada database
disesuaikan juga dengan kebutuhan.
Pengerjaan dilakukan dengan progres setiap hari, dengan setiap
harinya menargetkan perkembangan dari hari sebelumnya.
Progres
penyelesaian aplikasi terus dipantau oleh Pembimbing Lapangan.
1.6.5. Pengujian dan Evaluasi
Pengujian dilakukan oleh pembimbing lapangan setiap bagian dari
fitur telah selesai dikerjakan untuk memberikan evaluasi ketika ada
yang tidak sesuai, dan persetujuan apabila sudah sesuai.
1.7.
Sistematika Laporan
Laporan kerja praktik ini terdiri dari 7 bab dengan rincian sebagai
berikut:
1.7.1. Bab I: Pendahuluan
Bab ini berisi tentang latar belakan masalah, tujuan, manfaat, rumusan
masalah, lokasi dan waktu kerja praktik, metodologi, dan sistematika
laporan.
1.7.2. Bab II: Profil Instansi
Bab ini berisi sekilas tentang profil Fakultas Teknologi Elektro dan
Informatika Cerdas.
1.7.3. Bab III: Tinjauan Pustaka
Dalam bab ini dibahas mengenai konsep-konsep pembuatan aplikasi,
dasar teori, teknologi yang dipakai dalam pembuatan aplikasi.
1.7.4. Bab IV: Implementasi Sistem
Dalam bab ini dibahas tentang lapisan antarmuka, lapisan kontrol,
lapisan data, dan antarmuka pengguna.
1.7.5. Bab V: Pengujian dan Evaluasi
Dalam bab ini dibahas tentang lapisan antarmuka, lapisan kontrol,
lapisan data, dan antarmuka pengguna.
1.7.6. Bab VI: Kesimpulan dan Saran
Bab ini berisi tentang kesimpulan dan saran yang didapatkan dari
tugas selama kerja praktik.
BAB
II
PROFIL
INSTANSI
2.1.
Profil Instansi
Fakultas Teknologi Elektro dan Informatika Cerdas
(F-Electics) adalah fakultas unggulan di ITS yang didirikan sebagai
gabungan dari Fakultas Teknologi Informasi dan Komunikasi (FTIK)
dan Fakultas Teknologi Elektro (FTE) yang terdiri dari 6 Departemen
dengan lebih dari 2500 mahasiswa baik di tingkat S1, S2 ataupun
S3.F-Electics hadir dengan visi membentuk sumber daya manusia
berkarakter, berbudi unggul serta berkelas dunia dalam bidang
teknologi elektro, sistem informasi, biomedik, komputer, informatika
dan teknologi informasi..
2.2.
Struktur Organisasi
Struktur organisasi di FTEIC dapat dilihat pada Gambar 2.1.
2.3.
Lokasi Instansi
Penampakan depan salah satu departemen yang ada pada
FTEIC ITS dapat dilihat pada Gambar 2.2.
Alamat : Jl. Teknik Kimia - Gedung Departemen Teknik Informatika
Kampus Institut Teknologi Sepuluh Nopember Surabaya
Jalan Raya ITS, Sukolilo, Surabaya 60111, Indonesia
BAB
III
TINJAUAN
PUSTAKA
3.1.
Android
Merupakan sistem operasi berbasis Linux yang dirancang
untuk perangkat bergerak layar sentuh seperti smartphone dan
komputer tablet.
3.2.
Python
Python adalah Bahasa pemrograman interpretatif multiguna
dengan filosofi perancangan yang berfokus pada tingkat keterbacaan
kode. Python diklaim sebagai bahasa yang menggabungkan
kapabilitas, kemampuan, dengan sintaksis kode yang sangat jelas, dan
dilengkapi dengan fungsionalitas pustaka standar yang besar serta
komprehensif. Python juga didukung oleh komunitas yang besar.
Python mendukung multi paradigma pemrograman, utamanya; namun
tidak dibatasi; pada pemrograman berorientasi objek, pemrograman
imperatif, dan pemrograman fungsional. Salah satu fitur yang tersedia
pada python adalah sebagai bahasa pemrograman dinamis yang
dilengkapi dengan manajemen memori otomatis. Seperti halnya pada
bahasa pemrograman dinamis lainnya, python umumnya digunakan
sebagai bahasa skrip meski pada praktiknya penggunaan bahasa ini
lebih luas mencakup konteks pemanfaatan yang umumnya tidak
dilakukan dengan menggunakan bahasa skrip. Python dapat
digunakan untuk berbagai keperluan pengembangan perangkat lunak
dan dapat berjalan di berbagai platform sistem operasi.
3.3.
Django
Django adalah web framework Python yang didesain untuk
membuat
aplikasi
web
yang
dinamis,
kaya
fitur
dan
aman. Django yang dikembangkan oleh Django Software Foundation
terus mendapatkan perbaikan sehingga membuat web framework yang
3.4.
JavaScript
JavaScript adalah sebuah script yang memungkinkan kita
mengimplementasikan hal-hal kompleks pada halaman web terutama
yang bersifat interaktif. Javascript juga dapat digunakan untuk
memanipulasi dan mengirim data pada browser pengguna.
3.5.
HTML
Hyper Text Markup Language (HTML) adalah sebuah bahasa
markah yang digunakan untuk membuat sebuah halaman web,
menampilkan berbagai informasi di dalam sebuah penjelajah web
Internet dan pemformatan hiperteks sederhana yang ditulis dalam
berkas format ASCII agar dapat menghasilkan tampilan wujud yang
terintegerasi.
3.6.
Kotlin
Kotlin merupakan bahasa pemrograman modern, disajikan
secara statis yang berjalan pada platform Java Virtual Machine (JVM).
Kotlin menggunakan compiler LLVM yang artinya, dapat dikompilasi
ke dalam kode JavaScript. Bahasa pemrograman yang satu ini banyak
diminati oleh para developer dikarenakan mudah untuk dipelajari dan
bisa cross-platform.
3.7.
Web Server
Web Server adalah sebuah perangkat lunak server yang
berfungsi menerima permintaan HTTP atau HTTPS dari klien yang
dikenal dengan web browser dan mengirimkan kembali hasilnya
dalam halaman-halaman web yang umumnya berbentuk dokumen
HTML.
3.8.
Android Studio
Meupakan Integrated Development Environment (IDE) yang
dibangun di atas perangkat lunak JetBrains IntelliJ IDEA dan didesain
khusus untuk pengembangan Android. Juga terdapat fitur version
control menggunakan Git yang memudahkan untuk bekerja dengan
tim.
BAB
IV
IMPLEMENTASI
SISTEM
Bab ini membahas tentang implementasi dari perancangan
fitur dan pengaplikasian fitur.
4.1 Implementasi Sistem
Fitur yang dibuat merupakan bahasa kotlin dimana
didalamnya terdapat activity yang bertugas untuk menampilkan
layout, lalu adapter untuk menampilkan data dalam bentuk list, dan
model sebagai representasi data dari suatu modul.
Aplikasi melakukan konsumsi Application Interface Program
untuk menerima data dari sistem basis data menggunakan Retrofit
yang merupakan library tambahan untuk merubah API interfaces
menjadi callable objects.
4.2 Implementasi Tampilan Halaman
4.2.1. Menampilkan Halaman Login
Halaman login adalah halaman default untuk aplikasi ini.
Pengguna dapat login menggunakan username dan password field
yang disediakan. Kode Sumber 4.1 Menampilkan dependensi dan
Kode Sumber 4.2 Menampilkan kode sumber untuk tampilan login.
Kode Sumber 4.1: Dependensi Halaman Login import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.google.android.material.snackbar.Snackbar import com.kpbois.fteicmobile.retrofit.ApiService import com.kpbois.fteicmobile.retrofit.LoginResponse import kotlinx.android.synthetic.main.activity_login.* import retrofit2.Call import retrofit2.Callback import retrofit2.Response
class LoginActivity : AppCompatActivity(), View.OnClickListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) setContentView(R.layout.activity_login) bt_login.setOnClickListener(this)
if (Helper.getToken(this)!!.isNotEmpty()) { val intent = Intent(this,
HomeActivity::class.java)
startActivity(intent) finish()
} }
override fun onClick(p0: View?) { when (p0?.id) { R.id.bt_login -> { val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(currentFocus?.windowToke n, 0) login() } } }
private fun login() {
if (et_username.text.isNullOrBlank()) { Toast.makeText(this, "Username tidak boleh kosong.", Toast.LENGTH_SHORT).show() return
}
if (et_password.text.isNullOrBlank()) { Toast.makeText(this, "Password tidak boleh kosong.", Toast.LENGTH_SHORT).show() return } loading(true) ApiService.endpoint.login( et_username.text.toString(), et_password.text.toString() ).enqueue(object : Callback<LoginResponse>{ override fun onFailure(call:
Call<LoginResponse>, t: Throwable) { t.printStackTrace() Snackbar.make(findViewById(android.R.id.content), t.localizedMessage, Snackbar.LENGTH_SHORT).show() loading(false) }
override fun onResponse(call: Call<LoginResponse>, response:
t.printStackTrace() Snackbar.make(findViewById(android.R.id.content), t.localizedMessage, Snackbar.LENGTH_SHORT).show() loading(false) }
override fun onResponse(call: Call<LoginResponse>, response: Response<LoginResponse>) { loading(false) when (response.code()) { in 200..299 -> { Helper.setToken(this@LoginActivity, response.body()?.token) val intent = Intent(this@LoginActivity, HomeActivity::class.java) startActivity(intent) finish() } in 400..499 -> { Snackbar.make(findViewById(android.R.id.content), response.errorBody()!!.string(), Snackbar.LENGTH_SHORT).show() } in 500..599 -> { Snackbar.make(findViewById(android.R.id.content), "Something went wrong.",
Snackbar.LENGTH_SHORT).show() } } } }) }
Kode Sumber 4.2: Kode Sumber Halaman Login
4.2.2. Menampilkan Halaman Dashboard
Setelah login, pengguna akan diarahkan ke halaman
dashboard. Halaman ini berisi kategori jenis kegiatan yaitu prestasi,
sertifikasi, training, journal / konferensi, kuliah tamu. Dependensi dan
kode sumber untuk halaman dashboard dapat dilihat pada Kode
Suimber 4.3 dan 4.4.
private fun loading(state: Boolean) { if (state) { pb_loading.visibility = View.VISIBLE bt_login.visibility = View.GONE } else { pb_loading.visibility = View.GONE bt_login.visibility = View.VISIBLE } } }
Kode Sumber 4.3: Dependensi Halaman Dashboard import android.content.Intent import android.os.Build import android.os.Bundle import android.view.* import android.widget.ImageView import android.widget.Space import android.widget.TextView import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.cardview.widget.CardView import androidx.constraintlayout.widget.ConstraintLayout import com.kpbois.fteicmobile.konferensiandjurnal.ViewKonju r import com.kpbois.fteicmobile.kultam.ViewKultam import com.kpbois.fteicmobile.prestasi.ViewPrestasi import com.kpbois.fteicmobile.retrofit.ApiService import com.kpbois.fteicmobile.retrofit.DepartemenModel import com.kpbois.fteicmobile.submission.ViewSubmission import com.kpbois.fteicmobile.training.ViewTraining import kotlinx.android.synthetic.main.activity_home2.* import retrofit2.Call import retrofit2.Callback import retrofit2.Response
class HomeActivity : AppCompatActivity(), View.OnClickListener {
private var validationPage: MenuItem? = null private var isAdmin = false
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_home2) setSupportActionBar(toolbar) supportActionBar?.elevation = 0f supportActionBar?.setDisplayShowTitleEnabled(false) if (Helper.getToken(this).isNullOrEmpty()) { val intent = Intent(this,
LoginActivity::class.java) startActivity(intent) finish() } home_page.afterMeasured { nameLayout(home_page, relativeLayout4) } relativeLayout4.afterMeasured { nameView(relativeLayout4, space, imageView4) } cv_training.afterMeasured { changeImageSize(cv_training, imageView9) changeImageSize(cv_training, imageView11) changeImageSize(cv_training, imageView8) changeImageSize(cv_training, imageView10) dynamicMargin(cv_training, textView8) dynamicMargin(cv_training, textView9) dynamicMargin(cv_training, textView10) dynamicMargin(cv_training, textView11) } getUserInfo() getDepartemen() }
override fun onClick(p0: View?) { when (p0?.id) {
R.id.cv_kultam -> {
val intent = Intent(this, ViewKultam::class.java)
startActivity(intent) }
R.id.cv_konjur -> {
override fun onClick(p0: View?) { when (p0?.id) {
R.id.cv_kultam -> {
val intent = Intent(this, ViewKultam::class.java)
startActivity(intent) }
R.id.cv_konjur -> {
val intent = Intent(this, ViewKonjur::class.java)
startActivity(intent) }
R.id.cv_prestasi -> {
val intent = Intent(this, ViewPrestasi::class.java) startActivity(intent) // overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out) } R.id.cv_training -> {
val intent = Intent(this, ViewTraining::class.java)
startActivity(intent) }
} }
override fun onPrepareOptionsMenu(menu: Menu?): Boolean { validationPage = menu?.findItem(R.id.action_show_validation) validationPage?.isVisible = isAdmin return super.onPrepareOptionsMenu(menu) }
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.home_menu, menu) return true
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) { R.id.menu_password -> { // intent ubah password true
}
R.id.action_show_validation -> { val intent = Intent(this, ViewSubmission::class.java) startActivity(intent) true } R.id.action_logout -> { Helper.setToken(this, "") Helper.setUserInfo(null)
return when (item.itemId) { R.id.menu_password -> { // intent ubah password true
}
R.id.action_show_validation -> { val intent = Intent(this, ViewSubmission::class.java) startActivity(intent) true } R.id.action_logout -> { Helper.setToken(this, "") Helper.setUserInfo(null) startActivity(Intent(this, LoginActivity::class.java)) finish() true } else -> super.onOptionsItemSelected(item) } }
inline fun View.afterMeasured(crossinline f: View.() -> Unit) {
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener{
override fun onGlobalLayout() {
if (measuredHeight > 0 && measuredWidth > 0) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { this@afterMeasured.viewTreeObserver.removeOnGlobalLa youtListener(this) }else{ this@afterMeasured.viewTreeObserver.removeGlobalOnLa youtListener(this) } f() } } }) }
private fun changeImageSize(cardView: CardView, imageView: ImageView){
val params : ViewGroup.LayoutParams = imageView.layoutParams
params.width = cardView.width / 2 params.height = cardView.height / 2 imageView.layoutParams = params }
private fun nameLayout(base: ConstraintLayout, target: ConstraintLayout) {
val params : ViewGroup.LayoutParams = target.layoutParams
params.height = base.height / 4 target.layoutParams = params }
private fun nameView(constraintLayout: ConstraintLayout, space: Space, imageView: ImageView){
val paramsSpace : ViewGroup.LayoutParams = space.layoutParams
val paramsImage : ViewGroup.LayoutParams = imageView.layoutParams
val width = constraintLayout.width / 2 - constraintLayout.width / 30 paramsSpace.width = width paramsImage.width = width + constraintLayout.width / 10 paramsImage.height = width + constraintLayout.width / 10 space.layoutParams = paramsSpace imageView.layoutParams = paramsImage }
private fun dynamicMargin(cardView: CardView, textView: TextView) {
val params = textView.layoutParams as ViewGroup.MarginLayoutParams
params.setMargins(0, cardView.height/10,0,0) textView.layoutParams = params
private fun getUserInfo() {
val token = "Token " + Helper.getToken(this)
ApiService.endpoint.getUserInfo(token).enqueue(objec t : Callback<AccountModel> {
override fun onResponse(call: Call<AccountModel>, response:
Response<AccountModel>) {
if (response.isSuccessful && response.body() != null) {
val userInfo = response.body()!! tv_nama.text = userInfo.nama tv_departemen.text = userInfo.departemen isAdmin = userInfo.isAdmin Helper.setUserInfo(userInfo) } else { if (response.code() == 401) { startActivity(Intent(this@HomeActivity, LoginActivity::class.java)) finish() } Toast.makeText( this@HomeActivity, "Failed: ${response.message()}", Toast.LENGTH_SHORT ).show() } }
override fun onFailure(call: Call<AccountModel>, t: Throwable) { Toast.makeText( this@HomeActivity, "Failed: ${t.localizedMessage}", Toast.LENGTH_SHORT ).show() } }) }
Kode Sumber 4.4: Kode Sumber Halaman Dashboard private fun getDepartemen() {
ApiService.endpoint.getDepartemen().enqueue(object: Callback<List<DepartemenModel>>{
override fun onResponse(call: Call<List<DepartemenModel>>, response: Response<List<DepartemenModel>>) {
if (response.isSuccessful && response.body() != null) {
val result = response.body()!! val departemen =
ArrayList<String>()
for (item in result){
departemen.add(item.nama) } Helper.setDepartemen(departemen) } else { if (response.code() == 401) { startActivity(Intent(this@HomeActivity, LoginActivity::class.java)) finish() } Toast.makeText( this@HomeActivity, "Failed: ${response.message()}", Toast.LENGTH_SHORT ).show() } }
override fun onFailure(call: Call<List<DepartemenModel>>, t: Throwable) { Toast.makeText( this@HomeActivity, "Failed: ${t.localizedMessage}", Toast.LENGTH_SHORT ).show() } }) } }
4.2.3. Menampilkan Halaman Kuliah Tamu
Halaman kuliah tamu berisi daftar kuliah tamu yang tercatat.
Field yang ditampilkan adalah nama, pemateri, tanggal, departemen
dan tingkat. Dependensi dan Kode Sumber dapat dilihat pada Kode
Sumber 4.5 dan 4.6.
Kode Sumber 4.5: Dependensi Halaman Kuliah Tamu import android.app.Activity import android.content.Context import android.content.Intent import android.os.Build import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.SearchView import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.snackbar.Snackbar import com.kpbois.fteicmobile.Helper import com.kpbois.fteicmobile.LoginActivity import com.kpbois.fteicmobile.R import com.kpbois.fteicmobile.retrofit.ApiService import kotlinx.android.synthetic.main.activity_view2.* import retrofit2.Call import retrofit2.Callback import retrofit2.Response import retrofit2.Call import retrofit2.Callback import retrofit2.Response
class ViewKultam : AppCompatActivity(), View.OnClickListener {
companion object {
const val FILTER_CODE = 100 const val ADD_KULTAM = 101 const val KULTAM_DETAIL = 102 }
private lateinit var kultamAdapter: AdapterKultam
private var modelFilter = ModelFilter() private val listInstitusi =
arrayListOf<String>()
private val listTingkat = arrayListOf<String>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view2) setSupportActionBar(toolbar2) supportActionBar?.apply { setDisplayHomeAsUpEnabled(true) title = "Kuliah Tamu"
} fab_add.setOnClickListener(this) sw_list.setOnRefreshListener { filterData() } prepareRecyclerView() }
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.view_menu, menu) val searchItem =
menu?.findItem(R.id.action_search)
val searchView = searchItem?.actionView as SearchView searchView.apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { isIconifiedByDefault = false isIconified = false } setOnQueryTextListener(object : SearchView.OnQueryTextListener {
override fun onQueryTextSubmit(p0: String?): Boolean {
kultamAdapter.filter.filter(p0) return true
}
override fun onQueryTextChange(p0: String?): Boolean { kultamAdapter.filter.filter(p0) return true } }) }
return true }
override fun onQueryTextChange(p0: String?): Boolean { kultamAdapter.filter.filter(p0) return true } }) } searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { override fun
onMenuItemActionCollapse(item: MenuItem): Boolean { val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(currentFocus?.windowToke n, 0)
return true // Return true to collapse action view
}
override fun
onMenuItemActionExpand(item: MenuItem): Boolean { searchView.requestFocusFromTouch() val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT , 0)
return true // Return true to expand action view } } ) return super.onCreateOptionsMenu(menu) }
override fun onOptionsItemSelected(item: MenuItem): Boolean {
return when (item.itemId) { R.id.action_filter -> { val intent = Intent(this, FilterKultam::class.java) intent.putExtra("model_filter", modelFilter) intent.putExtra("list_institusi", listInstitusi) intent.putExtra("list_tingkat", listTingkat) startActivityForResult(intent, FILTER_CODE) true
val intent = Intent(this, FilterKultam::class.java) intent.putExtra("model_filter", modelFilter) intent.putExtra("list_institusi", listInstitusi) intent.putExtra("list_tingkat", listTingkat) startActivityForResult(intent, FILTER_CODE) true } else -> super.onOptionsItemSelected(item) } }
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) if (resultCode == Activity.RESULT_OK) { when (requestCode) { FILTER_CODE -> { if (data != null) { modelFilter = data.getParcelableExtra("model_filter") filterData() } } ADD_KULTAM, KULTAM_DETAIL -> filterData() } } }
override fun onClick(p0: View?) { when (p0?.id) {
fab_add.id -> {
val intent = Intent(this, AddKultam::class.java) startActivityForResult(intent, ADD_KULTAM) } } }
private fun prepareRecyclerView() {
kultamAdapter = AdapterKultam().apply { onClickListener = object :
AdapterKultam.OnClickListener {
override fun onClick(data: ModelKultam) { val intent = Intent(this@ViewKultam, DetailKultam::class.java) intent.putExtra(DetailKultam.KULTAM_DETAIL, data) startActivityForResult(intent, KULTAM_DETAIL) } } } rv_list.apply { layoutManager = LinearLayoutManager(this@ViewKultam, RecyclerView.VERTICAL, false) adapter = kultamAdapter } filterData() }
private fun filterData() { sw_list.isRefreshing = false rv_list.isVisible = false progressBar.isVisible = true
val token = "Token " + Helper.getToken(this) var institusi = "" var tingkat = "" modelFilter.institusi.forEach { institusi = "$it,$institusi" } modelFilter.tingkat.forEach { tingkat = "$it,$tingkat" } ApiService.endpoint.getFilterKultam( token, if (institusi.isNotBlank()) institusi.removeSuffix(",") else null, if (tingkat.isNotBlank()) tingkat.removeSuffix(",") else null, if
(modelFilter.tanggalMulai.isNotBlank()) modelFilter.tanggalMulai else null, if
(modelFilter.tanggalSelesai.isNotBlank()) modelFilter.tanggalSelesai else null ).enqueue(object :
Callback<List<ModelKultam>> {
override fun onResponse(
call: Call<List<ModelKultam>>, response: Response<List<ModelKultam>> ) { progressBar.isVisible = false if (response.isSuccessful && response.body() != null) {
val list = response.body()!! list.filter { it.isValidated }
override fun onResponse( call: Call<List<ModelKultam>>, response: Response<List<ModelKultam>> ) { progressBar.isVisible = false if (response.isSuccessful && response.body() != null) {
val list = response.body()!! list.filter { it.isValidated } kultamAdapter.setData(ArrayList(list)) list.forEach { if (!listInstitusi.contains(it.institusi)) listInstitusi.add(it.institusi) if (!listTingkat.contains(it.tingkat)) listTingkat.add(it.tingkat) } if (list.isEmpty()) { tv_notfound.isVisible = true rv_list.isVisible = false } else { tv_notfound.isVisible = false rv_list.isVisible = true } } else { if (response.code() == 401) { startActivity(Intent(this@ViewKultam, LoginActivity::class.java)) finish() } Snackbar.make(findViewById(android.R.id.content), "Something went wrong.",
Snackbar.LENGTH_SHORT).show() }
}
override fun onFailure(call: Call<List<ModelKultam>>, t: Throwable) { progressBar.isVisible = false t.printStackTrace() Snackbar.make(findViewById(android.R.id.content), t.localizedMessage, Snackbar.LENGTH_SHORT).show() } }) } }
Kode Sumber 4.6: Kode Sumber Halaman Kuliah Tamu
4.2.4. Menampilkan Halaman Konferensi / Jurnal
Halaman konferensi berisi daftar konferensi / jurnal yang
tercatat. Field yang ditampilkan adalah nama, pelaku, dan tahun.
Dependensi dan Kode Sumber dapat dilihat pada Kode Sumber 4.7
dan 4.8.
override fun onFailure(call:
Call<List<ModelKultam>>, t: Throwable) { progressBar.isVisible = false t.printStackTrace() Snackbar.make(findViewById(android.R.id.content), t.localizedMessage, Snackbar.LENGTH_SHORT).show() } }) } } import android.app.Activity import android.content.Context import android.content.Intent import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle
Kode Sumber 4.7: Dependensi Halaman Konferensi / Jurnal import android.view.Menu import android.view.MenuItem import android.view.View import android.view.inputmethod.InputMethodManager import android.widget.SearchView import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.kpbois.fteicmobile.Helper import com.kpbois.fteicmobile.R import com.kpbois.fteicmobile.download.DownloadActivity import com.kpbois.fteicmobile.retrofit.ApiService import com.kpbois.fteicmobile.retrofit.KonferensiResponse import kotlinx.android.synthetic.main.activity_view2.* import retrofit2.Call import retrofit2.Callback import retrofit2.Response
class ViewKonjur : AppCompatActivity(), View.OnClickListener {
private lateinit var recyclerView: RecyclerView private val listKonferensi =
arrayListOf<ModelKonferensi>() private val listJurnal = arrayListOf<ModelJurnal>()
private val listTempat = arrayListOf<String>() private val state: MutableLiveData<String> = MutableLiveData()
private lateinit var adapterKonferensi: AdapterKonferensi
private lateinit var adapterJurnal: AdapterJurnal
private var modelFilterKonferensi =
ModelFilterKonferensi(tahun = null, scopus = false) private var modelFilterJurnal =
ModelFilterJurnal(tahun = null, scopus = false) private var isAdmin = false
companion object { const val DETAIL = 40 const val ADD = 41
const val FILTER_KONFERENSI = 42 const val FILTER_JURNAL = 43
const val FILTER_DEPARTEMEN = "departemen" const val FILTER_TINGKAT = "tingkat" const val FILTER_TEMPAT = "tempat" const val FILTER_TAHUN = "tahun" const val FILTER_SCOPUS = "scopus" }
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_view2) setSupportActionBar(toolbar2) supportActionBar?.apply { setDisplayHomeAsUpEnabled(true) setDisplayShowHomeEnabled(true) }
val userInfo = Helper.getUserInfo() isAdmin = userInfo?.isAdmin as Boolean configuration()
}
private fun changeAdapterJurnal(string: String?) { adapterJurnal = AdapterJurnal()
adapterJurnal.apply {
setOnClickListener(object : AdapterJurnal.OnClickListener {
override fun onClick(data: ModelJurnal) { val intent = Intent(this@ViewKonjur, DetailKonjur::class.java) intent.apply { putExtra(DetailKonjur.KONJUR_DETAIL, data) intent.putExtra(DetailKonjur.STATE, string) }
private fun changeAdapterKonferensi(string: String?) { adapterKonferensi = AdapterKonferensi() adapterKonferensi.apply { setOnClickListener(object : AdapterKonferensi.OnClickListener {
override fun onClick(data: ModelKonferensi) { val intent = Intent(this@ViewKonjur, DetailKonjur::class.java) intent.apply { putExtra(DetailKonjur.KONJUR_DETAIL, data) putExtra(DetailKonjur.STATE, string) } startActivityForResult(intent, DETAIL) } }) setData(listKonferensi) } recyclerView.adapter = adapterKonferensi }
private fun configuration() {
val scrollListener = object : RecyclerView.OnScrollListener() { override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) if (newState == RecyclerView.SCROLL_STATE_IDLE) { fab_add.show() } else if (newState == RecyclerView.SCROLL_STATE_DRAGGING) { fab_add.hide() } } } recyclerView = rv_list recyclerView.apply { setHasFixedSize(true) layoutManager = LinearLayoutManager(this@ViewKonjur) addOnScrollListener(scrollListener) } fab_add.setOnClickListener(this) state.apply { observe(this@ViewKonjur, Observer { string -> if (string.equals("konferensi",true)) { getKonferensi(string) } else if (string.equals("jurnal",true)) {
getKonferensi(string) } else if (string.equals("jurnal",true)) { getJurnal(string) } }) value = "Konferensi" } sw_list.setOnRefreshListener { if (state.value!!.equals("konferensi",true)) { getKonferensi("Konferensi") sw_list.isRefreshing = false modelFilterKonferensi =
ModelFilterKonferensi(tahun = null, scopus = false) } else if (state.value!!.equals("jurnal",true)) { getJurnal("Jurnal") sw_list.isRefreshing = false modelFilterJurnal =
ModelFilterJurnal(tahun = null, scopus = false) }
} }
private fun getKonferensi(string: String) { supportActionBar?.title = string progressBar.visibility = View.VISIBLE listKonferensi.clear()
val token = "Token " + Helper.getToken(this) ApiService.endpoint.getKonferensi(token) .enqueue(object :
Callback<List<KonferensiResponse>>{
override fun onFailure(call: Call<List<KonferensiResponse>>, t: Throwable) { progressBar.visibility = View.GONE
}
override fun onResponse(call:
Call<List<KonferensiResponse>>, response: Response<List<KonferensiResponse>>) { progressBar.visibility = View.GONE val resp = response.body()!! for (i in resp) {
if (isAdmin) {
val model = ModelKonferensi( id = i.id, judul = i.judul, author = i.author, departemen = i.departemen, published_at = i.published_at, url = i.url, tahun = i.tahun, tingkat = i.tingkat, pi = i.pi, pn = i.pn, konf_hal = i.konf_hal, tempat = i.tempat,
tanggal_mulai = i.tanggal_mulai, tanggal_selesai = i.tanggal_selesai, scopus = i.scopus, isValidated = i.is_validated ) listKonferensi.add(model) } else { if (i.is_validated.toBoolean()){ val model = ModelKonferensi( id = i.id, judul = i.judul, author = i.author, departemen = i.departemen, published_at = i.published_at, url = i.url, tahun = i.tahun, tingkat = i.tingkat, pi = i.pi, pn = i.pn, konf_hal = i.konf_hal, tempat = i.tempat, tanggal_mulai = i.tanggal_mulai, tanggal_selesai = i.tanggal_selesai, scopus = i.scopus, isValidated = i.is_validated ) listKonferensi.add(model) } } if (!listTempat.contains(i.tempat)) listTempat.add(i.tempat) }
changeAdapterKonferensi(string) }
}) }
private fun getJurnal(string: String) { supportActionBar?.title = string progressBar.visibility = View.VISIBLE listJurnal.clear()
val token = "Token " + Helper.getToken(this) ApiService.endpoint.getJurnal(
token).enqueue(object: Callback<List< ModelJurnal>>{
override fun onFailure(call: Call<List<ModelJurnal>>, t: Throwable) { progressBar.visibility = View.GONE }
override fun onResponse(call: Call<List<ModelJurnal>>, response: Response<List<ModelJurnal>>) {
progressBar.visibility = View.GONE val resp = response.body()!!
if (isAdmin) listJurnal.addAll(resp) else {
for (item in resp) { if (item.is_validated. toBoolean()) listJurnal.add(item) } } changeAdapterJurnal(string) } }) }
override fun onCreateOptionsMenu(menu: Menu?): Boolean { menuInflater.inflate(R.menu.konjur_menu, menu) val searchItem = menu?.findItem(R.id.action_searchKonjur)
val searchView = searchItem?.actionView as SearchView searchView.apply { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { searchView.isIconifiedByDefault = false searchView.isIconified = false } setOnQueryTextListener(object : SearchView.OnQueryTextListener{ override fun
onQueryTextSubmit(query: String?): Boolean { if (state.value!!.equals("konferensi",true)) adapterKonferensi.filter.filter(query) else if (state.value!!.equals("Jurnal", true)) adapterJurnal.filter.filter(query) return true } override fun
onQueryTextChange(newText: String?): Boolean { if
(state.value!!.equals("konferensi",true)) adapterKonferensi.filter.filter(query)
else if (state.value!!.equals("Jurnal", true)) adapterJurnal.filter.filter(query) return true } }) } searchItem.setOnActionExpandListener(object : MenuItem.OnActionExpandListener { override fun
onMenuItemActionExpand(item: MenuItem?): Boolean { searchView.requestFocusFromTouch() val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT , 0) return true } override fun
onMenuItemActionCollapse(item: MenuItem?): Boolean { val imm = getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager imm.hideSoftInputFromWindow(currentFocus?.windowToke n, 0) return true } }) return super.onCreateOptionsMenu(menu) }
override fun onOptionsItemSelected(item: MenuItem): Boolean { when(item.itemId){ R.id.action_konferensi -> state.value = "Konferensi" R.id.action_jurnal -> state.value = "Jurnal" R.id.action_filterKonjur -> { if (state.value!!.equals("konferensi", true)) { val intent = Intent(this, FilterKonferensi::class.java)
val tingkat = getList(R.array.tingkat_konferensi)
val tempat = listTempat intent.apply { putExtra(FilterKonferensi.state, state.value) putExtra(FilterKonferensi.ITEM_TINGKAT, tingkat) putExtra(FilterKonferensi.ITEM_TEMPAT, tempat) putExtra(FilterKonferensi.PREVIOUS_FILTER, modelFilterKonferensi) } startActivityForResult(intent, FILTER_KONFERENSI) } else {
val intent = Intent(this, FilterJurnal::class.java)
val tingkat = getList(R.array.tingkat_jurnal) intent.apply { putExtra(FilterJurnal.state, state.value) putExtra(FilterJurnal.ITEM_TINGKAT, tingkat) putExtra(FilterJurnal.PREVIOUS_FILTER, modelFilterJurnal) } startActivityForResult(intent, FILTER_JURNAL) } } R.id.action_download_konjur -> { val intent = Intent(this, DownloadActivity::class.java) startActivityForResult(intent, 500) } } return super.onOptionsItemSelected(item) }
private fun getList(resource: Int): ArrayList<String> {
val array =
resources.getStringArray(resource)
val arrayList = ArrayList<String>() arrayList.addAll(array)
return arrayList }
override fun onClick(v: View?) { when (v?.id) {
R.id.fab_add -> {
val intent = Intent(this, AddKonjur::class.java) intent.putExtra(AddKonjur.STATE, state.value) startActivityForResult(intent, ADD) } } }
private fun getFilterValue(values: ArrayList<String>?): String? {
if (values!!.isEmpty()) return null var result = ""
for (item in values) {
if (result != "") result = "$result," result = "$result$item"
}
return result }
private fun getDepartemenId(values: ArrayList<String>?): String? {
if (values!!.isEmpty()) return null val dept = Helper.getAllDepartemen() var result = ""
for (item in values) {
if (result != "") result = "$result," result =
"$result${dept.indexOf(item)+1}" }
return result }
private fun getScopus(scopus: String?): String? { return if (scopus == "false") null else scopus
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) when (requestCode) { ADD -> { if (resultCode == Activity.RESULT_OK) { val result = data?.getStringExtra("result") state.value = result } else if (resultCode == Activity.RESULT_CANCELED) { val result = data?.getStringExtra("result") state.value = result } } DETAIL -> { if (resultCode == Activity.RESULT_OK) { val result = data?.getStringExtra("result") state.value = result } }
FILTER_KONFERENSI -> { if (resultCode == Activity.RESULT_OK) { listKonferensi.clear() adapterKonferensi .setData(listKonferensi) progressBar.visibility = View.VISIBLE val resultDepartemen = data?
.getStringArrayListExtra(FILTER_DEPARTEMEN) val resultTingkat = data?
.getStringArrayListExtra(FILTER_TINGKAT) val resultTempat = data?
.getStringArrayListExtra(FILTER_TEMPAT) val resultTahun = data?
.getStringExtra(FILTER_TAHUN)
val scopus = getScopus(data? .getStringExtra(FILTER_SCOPUS)) modelFilterKonferensi =
ModelFilterKonferensi(resultDepartemen as ArrayList<String>, resultTingkat as ArrayList<String>, resultTempat as
ArrayList<String>, resultTahun, scopus?.toBoolean()) val token = "Token " + Helper.getToken(this) ApiService.endpoint .getFilterKonferensi( token = token, departemen = getDepartemenId( resultDepartemen), tingkat = getFilterValue( resultTingkat), tempat = getFilterValue( resultTempat), tahun = resultTahun?.trim(), scopus = scopus ).enqueue(object :
FILTER_KONFERENSI -> { if (resultCode == Activity.RESULT_OK) { listKonferensi.clear() adapterKonferensi .setData(listKonferensi) progressBar.visibility = View.VISIBLE val resultDepartemen = data?
.getStringArrayListExtra(FILTER_DEPARTEMEN) val resultTingkat = data?
.getStringArrayListExtra(FILTER_TINGKAT) val resultTempat = data?
.getStringArrayListExtra(FILTER_TEMPAT) val resultTahun = data?
.getStringExtra(FILTER_TAHUN)
val scopus = getScopus(data? .getStringExtra(FILTER_SCOPUS)) modelFilterKonferensi =
ModelFilterKonferensi(resultDepartemen as ArrayList<String>, resultTingkat as ArrayList<String>, resultTempat as
ArrayList<String>, resultTahun, scopus?.toBoolean()) val token = "Token " + Helper.getToken(this) ApiService.endpoint .getFilterKonferensi( token = token, departemen = getDepartemenId( resultDepartemen), tingkat = getFilterValue( resultTingkat), tempat = getFilterValue( resultTempat), tahun = resultTahun?.trim(), scopus = scopus ).enqueue(object :
Callback<List<KonferensiResponse>>{
override fun onFailure(call: Call<List<KonferensiResponse>>, t: Throwable) { progressBar.visibility = View.GONE
}
override fun onResponse(call:
Call<List<KonferensiResponse>>, response: Response<List<KonferensiResponse>>) { progressBar.visibility = View.GONE val resp = response.body()!! for (i in resp) {
if (isAdmin) {
val model = ModelKonferensi( i.id, i.judul, i.author, i.departemen, i.published_at, i.url, i.tahun, i.tingkat, i.pi, i.pn, i.konf_hal, i.tempat, i.tanggal_mulai, i.tanggal_selesai ) listKonferensi.add(model) }
else {
if (i.is_validated.toBoolean()) { val model = ModelKonferensi( i.id, i.judul, i.author, i.departemen, i.published_at, i.url, i.tahun, i.tingkat, i.pi, i.pn, i.konf_hal, i.tempat, i.tanggal_mulai, i.tanggal_selesai ) listKonferensi.add(model) } } if (!listTempat.contains(i.tempat)) listTempat.add(i.tempat) } changeAdapterKonferensi("Konferensi") } }) } }
FILTER_JURNAL -> { if (resultCode == Activity.RESULT_OK) { listJurnal.clear() adapterJurnal.setData(listJurnal) progressBar.visibility = View.VISIBLE val departemen = data?.getStringArrayListExtra(FILTER_DEPARTEMEN) val tingkat = data?.getStringArrayListExtra(FILTER_TINGKAT) val tahun = data?.getStringExtra(FILTER_TAHUN) val scopus = getScopus(data?.getStringExtra(FILTER_SCOPUS)) modelFilterJurnal = ModelFilterJurnal(departemen as ArrayList<String>, tingkat as ArrayList<String>, tahun,
scopus?.toBoolean())
val token = "Token " + Helper.getToken(this) ApiService.endpoint.getFilterJurnal( token = token, departemen = getDepartemenId(departemen), tingkat = getFilterValue(tingkat), tahun = tahun, scopus = scopus ).enqueue(object: Callback<List<ModelJurnal>>{
Kode Sumber 4.8: Kode Sumber Halaman Konferensi / Jurnal
4.2.5. Menampilkan Halaman Prestasi
Halaman Prestasi berisi daftar prestasi yang tercatat. Field
yang ditampilkan adalah nama, pelaku, tahun, dan capaian.
Dependensi dan Kode Sumber dapat dilihat pada Kode Sumber 4.9
dan 4.10.
override fun onFailure(call:
Call<List<ModelJurnal>>, t: Throwable) {
progressBar.visibility = View.GONE
}
override fun
onResponse(call: Call<List<ModelJurnal>>, response: Response<List<ModelJurnal>>) { progressBar.visibility = View.GONE val resp = response.body()!! if (isAdmin) listJurnal.addAll(resp) else {
for (item in resp) { if (item.is_validated.toBoolean()) listJurnal.add(item) } } changeAdapterJurnal("Jurnal") } }) } } } } }