• Tidak ada hasil yang ditemukan

Implementasi Aplikasi Monitoring Kinerja FTEIC ITS berbasis Android

N/A
N/A
Protected

Academic year: 2021

Membagikan "Implementasi Aplikasi Monitoring Kinerja FTEIC ITS berbasis Android"

Copied!
211
0
0

Teks penuh

(1)

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

(2)
(3)

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

(4)
(5)

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

(6)
(7)

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:

(8)
(9)

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

(10)
(11)

DAFTAR

ISI

VII

KATA PENGANTARIX

DAFTAR ISIXI

DAFTAR GAMBARXVII

DAFTAR TABELXIX

DAFTAR KODE SUMBERXXI

BAB I PENDAHULUAN1

1.1. L

ATAR

B

ELAKANG

1

1.2. T

UJUAN

1

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

(12)

2.2. S

TRUKTUR

O

RGANISASI

5

2.3. L

OKASI

I

NSTANSI

6

7

3.1. A7

3.2. P

YTHON

7

3.3. D

JANGO

7

3.4. J

AVA

S

CRIPT

8

3.5. HTML8

3.6. 8

3.7. W

EB

S

ERVER

8

3.8. A

NDROID

S

TUDIO

8

10

4.1 I

MPLEMENTASI

S

ISTEM

10

4.2

I

MPLEMENTASI

T

AMPILAN

H

ALAMAN

10

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

MPLEMENTASI

A

NDROID

C

OMPONENT

119

4.3.1.

119

4.3.2.

123

4.3.3.

126

(13)

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

(14)

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

(15)

187

189

(16)
(17)

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

(18)

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

(19)

DAFTAR

TABEL

(20)
(21)

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

(22)

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

(23)

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?

(24)

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

(25)

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.

(26)

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.

(27)

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.

(28)

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

(29)

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

(30)

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.

(31)
(32)

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.

(33)

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

(34)

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:

(35)

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() } } } }) }

(36)

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

(37)

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

(38)

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 -> {

(39)

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)

(40)

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() } } }) }

(41)

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

(42)

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() } }) }

(43)

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() } }) } }

(44)

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

(45)

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 } }) }

(46)

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

(47)

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) } } }

(48)

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 }

(49)

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() } }) } }

(50)

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

(51)

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

(52)

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" }

(53)

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) }

(54)

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 }

(55)

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)) {

(56)

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) }

} }

(57)

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,

(58)

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) }

(59)

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) } }) }

(60)

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)

(61)

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) }

(62)

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)

(63)

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 }

(64)

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 }

(65)

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

(66)

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 :

(67)

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 :

(68)

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) }

(69)

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") } }) } }

(70)

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>>{

(71)

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") } }) } } } } }

Gambar

Gambar 2.1: Struktur organisasi FTEIC
Gambar 2.2: Foto Departemen Informatika FTEIC ITS
Tabel 5.1: Tabel evaluasi pengujian aplikasi sesuai kebutuhan
Gambar 5.1: Tampilan hasil uji coba login pengguna
+7

Referensi

Dokumen terkait

Stasiun 4 memiliki nilai indeks dominasi yang lebih tinggi (0,44) dibandingkan dengan stasiun lainnya. Berdasarkan analisis PCA dapat disimpulkan bahwa terdapat

Tabel ini menghitung beban biaya tahunan total dari jaringan, seperti yang dimodelkan, dengan menambah capex tahunan (Tabel 7c) ke dalam pengeluaran operasional untuk setiap

of care atau standar kehati-hatian. Apabila direksi telah bersikap dan.. bertindak melanggar standard of care, maka direksi tersebut dianggap telah melanggar duty

Proses yang digunakan untuk memproduksi alumunium adalah proses elektrolisa dengan memakai metoda Hall-Heroult katoda yang dipakai PT INALUM masih di impor dari

Teoh (1992) menjelaskan bahwa bila manajer tidak menyukai qualified opinion dalam laporan keuangan dan memiliki pengaruh dalam menentukan auditor, maka mereka akan

Motif jasmaniah adalah motivasi yang dikarenakan tuntutan jasmani, seperti reflex, insting otomatis dan nafsu. Dari beberapa hasil wawancara yang didapat ada

Dengan ini menyatakan bahwa Karya Tulis Ilmiah dengan judul “Analisis Kualitatif Senyawa Boraks Pada Produk Otak-otak Bermerk Yang Beredar di Kecamatan Banyudono” merupakan

Dari 10 karakter kualitatif yang diamati pada penelitian ini, menunjukkan bahwa karakter bentuk buah, warna buah muda dan warna buah masak dalam genotip seragam,