Undergraduate Theses
Undergraduate Theses
Dosen Pembimbing
Dr. Eng. Febriliyan Samopa, S.Kom., M.Kom.
NIP. 197302191998021001
Dosen Pembimbing
Dr. Eng. Febriliyan Samopa, S.Kom., M.Kom.
NIP. 197302191998021001
Supervisor
Dr. Eng. Febriliyan Samopa, S.Kom., M.Kom.
NIP. 197302191998021001
TUGAS AKHIR
Disusun untuk Memenuhi Salah Satu Syarat
Memperoleh Gelar Sarjana Komputer
pada
Bidang Studi Infrastuktur dan Keamanan Teknologi Informasi
Departemen Sistem Informasi
Fakultas Teknologi Informasi dan Komunikasi
Insitut Teknologi Sepuluh Nopember
Oleh:
PLH KEPALA
DEPARTEMEN SISTEM INFORMASI
TUGAS AKHIR
Disusun untuk Memenuhi Salah Satu Syarat
Memperoleh Gelar Sarjana Komputer
pada
Bidang Studi Infrastuktur dan Keamanan Teknologi
Informasi
Jurusan Sistem Informasi
Fakultas Teknologi Informasi
Insitut Teknologi Sepuluh Nopember
Oleh:
ABSTRAK
Sebuah perusahaan penyedia kebutuhan fisik manusia
membutuhkan armada kendaraan dalam menyalurkan produk
atau layanannya dengan cepat. Namun saat ini, perusahaan
masih kesulitan dalam memonitor kinerja armadanya, apakah
sedang bekerja, apakah mengantarkan barang pada jalur yang
seharusnya, dan apakah barang yang sampai sesuai dengan
yang dibawa dari gudang. Sudah ada beberapa perusahaan
yang mengembangkan aplikasi yang bisa memonitor armada,
namun masih sedikit dan tergolong mahal. Untuk membantu
memenuhi kebutuhan dalam memantau armada perusahaan,
penelitian tugas akhir ini akan membuat sebuah aplikasi yang
berbasis Android agar perusahaan dapat melacak armadanya
sesuai dengan permasalahan diatas. Pemilihan aplikasi yang
berbasis Android ini sudah berdasarkan perti mbangan harga
perangkat yang murah, perangkat sudah digunakan oleh
banyak lapisan masyarakat baik yang berekonomi rendah
maupun tinggi, pendistribusian aplikasi di Android yang gratis,
dan tidak memerlukan alat khusus yang ditambahkan dalam
kendaraan. Perancangan desain dan prototype aplikasi dalam
penelitian ini menggunakan Google Design Sprint yang
dikembangkan oleh Google Venture mengingat beberapa
batasan, seperti waktu penelitian yang cukup singkat, belum
ada gambaran yang jelas bagaimana produk akhir akan seperti
apa, memungkinkan dalam adanya perubahan scope proyek,
dan perubahan standar produk yang akan dibuat. Dalam
ii
ABSTRACT
KATA PENGANTAR
Penulis
viii
DAFTAR ISI
ABSTRAK ................................................................................ i
ABSTRACT ............................................................................iii
DAFTAR ISI ........................................................................... ix
DAFTAR TABEL .................................................................xiii
DAFTAR GAMBAR ............................................................. xv
BAB I PENDAHULUAN ........................................................ 1
1.1. Latar Belakang Masalah ........................................... 1
1.2. Perumusan Masalah.................................................. 4
1.3. Batasan Masalah....................................................... 4
1.4. Tujuan Penelitian...................................................... 5
1.5. Manfaat Penelitian.................................................... 5
1.6. Relevansi .................................................................. 5
BAB II TINJAUAN PUSTAKA .............................................. 7
2.1 Studi Sebelumnya ..................................................... 7
2.2 Dasar Teori ............................................................. 11
2.2.1 Sistem Pemantau Armada .............................. 11
2.2.2 Android ........................................................... 22
2.2.3 Firebase.......................................................... 26
2.2.4 Google maps................................................... 31
2.2.5 Development Methodology - Google Design
Sprint 32
2.2.6 Usability Testing ............................................ 36
BAB III METODOLOGI ...................................................... 41
x
DAFTAR TABEL
Tabel 2.1 Studi sebelumnya (I)................................................ 7
Tabel 2.2 Studi sebelumnya (II) .............................................. 8
Tabel 2.3 Studi sebelumnya (III) ............................................. 9
Tabel 2.4 Studi sebelumnya (IV) ........................................... 10
Tabel 2.5 Proses bisnis manajemen perusahaan (I) ............... 15
Tabel 2.6 Proses bisnis perusahaan (II) ................................. 16
Tabel 2.7 Proses bisnis Sopir armada (I) ............................... 17
Tabel 2.8 Proses bisnis sopir armada (II) .............................. 18
Tabel 2.9 Proses bisnis pelanggan ......................................... 18
Tabel 2.10 Penjabaran konsep arsitektur sistem .................... 21
Tabel 2.11 Firebase - ChildEventListener() .......................... 29
Tabel 2.12 Firebase - orderBy ............................................... 30
Tabel 2.13 Firebase - Filtering .............................................. 31
Tabel 2.14 Google maps - API .............................................. 31
Tabel 2.15 Implementasi metodologi Usability Testing........ 38
Tabel 4.1 “How Might We” .................................................. 50
Tabel 4.2 Tabel asumsi-uji .................................................... 72
Tabel 4.3 Use case android manajemen perusahaan ............. 72
Tabel 4.4 Use case android android sopir perusahaan ........... 74
Tabel 4.5 Website manajemen perusahaan............................ 76
Tabel 4.6 Prototype smartphone manajemen perusahaan ...... 83
Tabel 4.7 Prototype smartphone sopir ................................... 89
Tabel 4.8 Desktop manajemen perusahaan ........................... 94
Tabel 5.1 Lingkungan aplikasi fleemo company ................. 107
Tabel 5.2 Lingkungan aplikasi fleemo driver ...................... 241
Tabel 5.3 Lingkungan aplikasi fleemo website ................... 329
Tabel 6.1 Uji coba fungsional.............................................. 339
Tabel 6.2 Pengujian aplikasi di berbagai sistem operasi ..... 347
Tabel 6.3 Uji kecepatan fleemo company ........................... 349
Tabel 6.4 Uji kecepatan fleemo driver ................................ 350
Tabel 6.5 Kecocokan website di berbagai browser ............. 351
xiv
DAFTAR GAMBAR
Gambar 2.1 Konsep proses bisnis aplikasi ........................... 19
Gambar 2.2 Konsep arsitektur system .................................. 20
Gambar 2.3 Android – Platform ........................................... 23
Gambar 2.4 Firebase - Contoh JSON Tree ........................... 27
Gambar 2.5 Firebase – DatabaseReference .......................... 27
Gambar 2.6 Firebase - contoh setValue() 1 .......................... 28
Gambar 2.7 Firebase - contoh setValue() 2 .......................... 28
Gambar 2.8 Tahapan google design sprint ........................... 34
Gambar 3.1 Tahapan pelaksanaan tugas akhir...................... 45
Gambar 4.1 Trackimo - Perangkat keras .............................. 52
Gambar 4.2 Trackimo – Mendaftar alat baru ....................... 53
Gambar 4.3 Trackimo - Visualisasi lokasi tiap perangkat .... 53
Gambar 4.4 Trackimo - Pengaturan pembatasan kecepatan . 54
Gambar 4.5 Trackimo – Pengaturan pembatasan area ......... 54
Gambar 4.6 Trackimo - Perangkat pengaktif SOS ............... 55
Gambar 4.7 Trackimo - UI fitur SOS ................................... 55
Gambar 4.8 Trackimo - Melihat daftar riwayat .................... 56
Gambar 4.9 Trackimo - Melihat riwayat tersimpan ............. 56
Gambar 4.10 Teletrac Navman – Pengelompokan kendaraan
................................................................................................ 57
Gambar 4.11 Teletrac Navman - Detail kendaraan .............. 58
Gambar 4.12 Teletrac Navman - Street View 1................... 59
Gambar 4.13 Teletrac Navman – Street View 2 ................... 59
Gambar 4.14 Teletrac Navman - Mengirimkan pesan pada 1
kendaraan ............................................................................... 60
Gambar 4.15 Teletrac Navman - Mengirimkan pesan pada >1
Kendaraan .............................................................................. 60
Gambar 4.16 Teletrac Navman - Pesan standar.................... 61
Gambar 4.17 Teletrac Navman - Membuat pesan perintah
penugasan ............................................................................... 61
xvi
1 BAB I
PENDAHULUAN
1.6. Relevansi
Relevansi dari penelitian ini berkaitan dengan mata kuliah
Algoritma dan Pemrograman, Permrograman Berorientasi
Objek, Analisa Desain Perangkat Lunak, Kontruksi
6
2 BAB II
TINJAUAN PUSTAKA
A. Trackimo
Trackimo adalah sebuah aplikasi yang memanfaatkan
3G GPS Fleet tracking system. Dalam penggunaanya
Trackimo merupakan sebuah alat kecil yang dibawa
bersama armada, dan pihak manajemen dapat
mengaksesnya melalui situs web. Produk ini
memberikan beberapa kelebihan bagi perusahaan
seperti mengurangi konsumsi bahan bakar dan waktu
tempuh dengan memberikan saran rute terdekat dan
terhindar dari macet. Lalu dengan fitur remote
employee, activity seperti idling mesin berlebihan,
penggunakan yang tidak terotorisasi, overtime,
kecepatan tinggi, dan sebagainya yang dapat
membahayakan dan merugikan perusahaan dapat
dihindari. Kemudian fitur reduce downtime yang
memberikan informasi mengenai armada perusahaan
mana yang dalam keadaan idling, sehingga membantu
perusahaan untuk membuat strategi manajemen armada
yang lebih baik lagi. [6]
B. Teletrac Navman
Teletrac Navman adalah sebuah aplikasi yang
memanfaatkan GPS untuk mengetahui status armada
13
A. Manajemen perusahaan
Manajemen perusahaan adalah aktor yang memiliki
akses untuk mendapatkan fungsi utama dari aplikasi
Fleet Monitoring System yakni mengelola pesanan
pelanggan, memberikan penugasan pada setiap armada
yang terdaftar dalam perusahaan, melihat ketersediaan
setiap armada, dan memantau lokasi setiap armada
yang sedang bertugas.
B. Sopir armada
Sopir armada adalah aktor yang memiliki tugas utama
untuk mengirimkan lokasi mereka pada server sehingga
15
C. Pelanggan
Pelanggan adalah aktor yang memiliki tugas untuk
memberikan pesanan dan mengkonfirmasi barang apa
saja dari pesanan mereka yang sudah sampai.
Konfirmasi ini akan dikirimkan ke manajemen
perusahaan sebagai referensi untuk perusahaan
menyelesaikan keseluruhan pesanan pelanggan.
A. Manajemen Perusahaan
Pada awalnya perusahaan harus memiliki identitas
seperti deskripsi perusahaan, barang yang dijual, daftar
armada dengan deskripsinya, dan daftar sopir dengan
deskripsinya. Dalam praktiknya sistem ini tidak
mengatur secara otomatis penjadwalan dan pemilihan
sopir dari setiap pesanan yang ada, namun dilakukan
secara manual oleh manajemen perusahaan. Jadi
proses-proses yang dilakukan adalah:
pelanggan, ID
penugasan)
B. Sopir Armada
Sopir armada tidak mendaftarkan diri dari perangkat
yang dimilikinya melainkan dari perangkat yang
dimiliki perusahaan. Pada perangkatnya sopir hanya
bisa log in menggunakan username dan password yang
diberikan perusahaan.
C. Pelanggan
Pelanggan tidak memiliki perangkat khusus untuk
dapat menggunakan sistem ini karena pelanggan tidak
melakukan pemesanan menggunakan aplikasi Sistem
Pemantau Armada. Untuk dapat mengkonfirmasi
pesanan yang diterima, pelanggan dapat
mengkonfirmasinya melalui perangkat yang dimiliki
sopir dan mengisikan sebuah token yang diberikan
perusahaan untuk memastikan validitas data yang
diberikan.
Start
Memberi
Penugasan
Tambahan
Membuat
Mengkonfirmasi
penugasan baru
pengerjaan tugas
Mengecek Armada
yang tersedia Mengirimkan
lokasi armada
Memberikan
penugasan pada Mengirimkan
sopir armada Barang ke
Pelanggan
True
Apakah Apakah
semua penugasan
False
barang sudah pada supir
sesuai? lain?
False
Finish
2,7,10
5
3,4,6,9
1,8,11
8
No Proses Data
1 Mengisi data penugasan ID Armada, Data
Sopir Armada ke Cloud penugasan (ID Produk,
Nama produk, jumlah
produk, nama pelanggan,
alamat pelanggan,
Token, ID Pesanan)
2 Cloud menyimpannya di Mapping penugasan (ID
server Firebase Armada, ID penugasan,
ID Produk, Nama
produk, jumlah produk,
nama pelanggan, alamat
pelanggan)
3 Smartphone Sopir Mapping Penugasan
menerima data penugasan
dari Cloud yang dikirimkan
Firebase. Sopir
menjalankan pekerjaan dan
mengaktifkan fitur
pelacakan lokasi
4 Smarphone Sopir API Key
mengaktifkan GPS dan
meminta kordinat lokasi ke
Cloud
5 Smartphone Sopir API Key, Latitude,
menerima kordinat dari Longitude
cloud yang dikirimkan
Server Google maps
6 Smartphone Sopir ID Perusahaan, ID
mengirimkan kordinat Armada, Latitude,
lokasi ke Cloud untuk Longitude
disampaikan ke Firebase
7 Cloud mengirimkan data ID Perusahaan, ID
dari Smartphone Sopir ke Armada, Latitude,
Firebase Longitude
22
2.2.2 Android
Sistem operasi yang akan digunakan untuk pengembangan
aplikasi Fleet Monitoring ini adalah Android yang merupakan
sistem operasi open source yang berbasis Linux, dengan
platform sebagai berikut: [9]
23
1. Linux Kernel
Android mengadopsi Linux Kernel untuk menjadi
lapisan paling dasar Android. Linux Kernel ini
berfungsi sebagai basis untuk manajemen proses,
manajemen memori dan manajemen perangkat. Kernel
juga menyediakan berbagai driver untuk semua
hardware yang ada di smarphone agar aplikasi dapat
dengan mudah mengakses dan menggunakan hardware.
Dengan kata lain, Kernel berfungsi sebagai jembatan
antara software dan hardware.
2. Hardware Abstraction Layer (HAL)
HAL menyediakan antarmuka standar yang
mengekspos kemampuan hardware ke level Java API
Framework yang lebih tinggi. HAL terdiri dari
beberapa modul library yang masing -masingnya
berguna untuk mengimplementasikan interface untuk
komponen hardware yang lebih spesifik seperti module
kamera atau Bluetooth. Saat kerangka API mengakses
hardware, Android system akan memanggil modul
perpustakaan untuk komponen hardware yang
dibutuhkan.
3. Android Runtime
Untuk perangkat dengan versi Android 5.0 (API Level
21), setiap aplikasi berjalan atas proses sendiri dengan
instance sendiri dari Android Runtime (ART). ART
dibuat untuk menjalankan beberapa virtual machine
sekaligus pada low-memory devices dengan
mengeksekusi DEX (Dalvic Executable) files, sebuah
bytecode format yang didesain untuk mengoptimasi
penggunaan memory.
4. Native C/C++ libraries
Banyak komponen utama android system seperti HAL
dan ART, dibangun dengan native code yang
membutuhkan native library berbasis C atau C++.
Platform Android menyediakan java frameworks APIs
untuk menampilkan fungsionalitas dari library ini ke
aplikasi. Misalkan, kita dapat mengakses OpenGL ES
25
{
"users": {
"alovelace": {
"name": "Ada Lovelace",
"contacts": { "ghopper": true },
},
"ghopper": { ... },
"eclarke": { ... }
}
}
mDatabase.child("users").child(userId).child("use
rname").setValue(name);
Method Penggunaan
onChildAdded() Mengambil list item atau
mendengarkan penambahan daftar
item. Event ini dipicu sekali untuk
setiap child yang ada kemudian setiap
child baru ditambahkan ke path yang
spesifik. DataSnapshot diteruskan ke
listener yang mengadung data child
baru
onChildChanged() Mendengarkan perubahan pada item
dalam daftar. Event digunakan setiap
30
Method Penggunaan
orderByChild() Mengurutkan data yang diambil
berdasarkan nilai dari child key spesifik
orderByKey() Mengurutkan data yang diambil
berdasarkan child key
orderByValue() Mengurutkan data yang diambil
berdasarkan child values
Method Penggunaan
limitToFirst() Membatasi jumlah item yang akan diambil
dimulai dari awal list data hasil
limitToLast() Membatasi jumlah item yang akan diambil
dimulai dari akhir list data hasil
startAt() Mengambil item lebih banyak atau sama
dengan specified key atau nilai tergantung
dari order-by yang dipilih
endAt() Mengambil item lebih sedikit atau sama
dengan specified key atau nilai tergantung
dari order-by yang dipilih
equalTo() Mengambil item sesuai dengan sepcified
key ata nilai tergantung dari order-by yang
dipilih
com.google.android.gms:play-services-
Google Mobile Ads
ads:10.0.1
pertanyaan-
pertanyaan
Observasi Kebisaaan Mendapatkan Tidak dapat
pengguna kebisaaan menemukan
diobservasi user, bukan apa yang
melalui apa yang dia sebenarnya
keseluruhan pikirkan. pengguna
proses Hasilnya dapat pikirkan atau
pengujian dibandingkan alasan dibalik
dengan metode kebisaaan
pengumupulan yang
data lain untuk dilakukan
validasi user
Rekaman Data Dapat melihat Sulit dalam
video interaksi tindakan dari menganalisis
user pengguna, dan data, sulit
mengenai juga ekspresi mendapatkan
proses wajahnya sudut kamera
usability untuk
testing pengambilan
direkam view terbaik
dengan
video
Software Setiap Tidak ada Menggunakan
loggding tindakan rintangan bagi software
user user, metode spesial, tidak
direkam ini dapat dapat
melalui data menginvestiga mengumpulka
logging si tindakan n informasi
software pengguna ekspresi user
aplication dalam
selama lingkungan
proses nyata
usability
testing
Verbal Hasil Dapat Tidak natural
protocol pemikiran mengungkapk dan
40
3 BAB III
METODOLOGI
1. Studi Literatur
Pada tahapan ini dilakukan pengumpulan literatur terkait
penelitian, baik berupa penelitian sebelumnya, artikel dan
jurnal baik dari buku maupun website. Studi literatur ini
dilaksanakan dalam waktu 1 minggu. Keluaran dari tahap
ini adalah pemahaman konsep penelitian.
4. Design Sprint
Perancangan blue print aplikasi dilakukan dengan Google
Design Sprint sehingga perancangan aplikasi nantinya
terstruktur, sesuai dengan hasil analisa, dan membutuhkan
waktu yang singkat. Design sprint memiliki 5 tahapan
pengerjaan yakni:
A. Define (menentukan fokus masalah), yakni
menggunakan input dari hasil analisa pengkategorian
user dan kebutuhannya, tahap ini akan menghasilkan
fokus permasalahan proses bisnis yang akan
diselesaikan
B. Diverge (membuat beberapa ide pengembangan
produk), yakni menggunakan input dari hasil define
untuk menghasilkan beberapa ide pengembangan
produk yang cocok
C. Decide (Menentukan satu ide untuk dikembangkan),
yakni memilih satu yang terbaik dari beberapa ide
tahap diverge untuk dibuat prototype-nya
D. Pembuatan prototype, yakni membuat prototype untuk
mendetailkan ide penyelesaian. Prototype inilah yang
nantinya akan diujikan ke user
E. Validasi, merupakan tahap terakhir design sprint
untuk mendapatkan tanggapan dari stakeholder, user,
43
5. Pengembangan Aplikasi
Tahapan ini adalah tahapan inti dimana semua aplikasi
sesuai blue print dirancang sampai bisa digunakan oleh
end-user baik dari segi user interface, fungsi-fungsi, dan
database-nya. Output dari tahapan ini adalah end-user
application. Tahapan ini direncanakan memakan waktu 9
minggu.
6. Usability Testing
Pada tahap ini aplikasi yang telah dirancang sebelumnya
diuji pada beberapa user secara random yang memiliki
pengetahuan tentang desain namun sama sekali tidak
mengerti tentang desain aplikasi penelitian ini karena calon
user yang menggunakan sebelumnya juga tidak tahu
rancangan aplikasi. Usability testing ini dilakukan untuk
mengetahui apakah user dapat menggunakan aplikasi
sehingga diharapkan dapat memberikan gambaran mana
User interface (UI) dan User Experience (UX) yang masih
kurang, mana fungsi yang belum bekerja maksimal, dan
melihat bug aplikasi yang tidak terdeteksi saat
pengembangannya. Output dari tahapan ini adalah
dokumen review usability testing yang menjadi acuan
dalam pemutakhiran aplikasi sebelum dipublikasikan.
Usability testing direncakan akan memakan 2 minggu.
7. Pemutahiran Aplikasi
Tahapan terakhir ini adalah perbaikan aplikasi sampai
menjadi layak untuk dipublikasikan kepada user
berdasarkan dokumen review usability testing yang
didapat pada tahap sebelumnya. Output dari tahapan ini
adalah final end-user application untuk dipublikasikan
kepada user yang menjadi target dan dokumen source code
44
Start B
Pemahaman End-user
Konsep Application
Prototype Finish
Feedback user/ahli
4 BAB 4
PERANCANGAN
Pada bab ini akan dijelaskan tentang gambaran umum sistem,
analisis dan desain sistem sesuai dengan metodologi Agile
Google Design Sprint.
4.3.1 Trackimo
Sebagai Fleet tracking system, Trackimo memiliki fitur dan
User interface sebagai berikut:
1. Pengelompokan Kendaraan
Teletrac Navman mengelompokkan kendaraan-
kendaraan berdasarkan lokasi. Pada gambar 4.10 dapat
dilihat bahwa di Daerah Palo Alto terdapat 5 kendaraan,
dimana 3 diantaranya dalam keadaan menyala.
2. Detail Kendaraan
Detail setiap kendaraan bisa dilihat dengan meletakkan
kursor pada posisi kendaaraan, lalu aplikasi akan
menampilkan Waktu beroperasi terakhir, pengemudi,
58
6. Perilaku pengemudi
Pihak manajemen dapat membuat batasan kecepatan
yang diperbolehkan. Apabila melebihi, maka akan
diberikan peringatan. Pengaturannya dapat dilihat
seperti gambar 4.18.
1. Login
gambar 4.23 merupakan tampilan awal aplikasi RFT.
Sebelum bisa mengakses informasi kendaraan, pertama
sekali harus login sesuai dengan username dan
password yang terdaftar.
2. Daftar kendaraan yang dimiliki akun
Setelah berhasil login, aplikasi menampilkan daftar
kendaraan yang dimiliki akun tersebut beserta dengan
lokasi terkhirnya, seperti gambar 4.24.
66
4. Riwayat Kendaraan
Untuk melihat riwayat lokasi kendaraan, pertama kali
riwayat yang dikelompokkan berdasarkan tanggal,
seperti yang dapat dilihat dalam gambar 4.27. Setelah
itu dapat dilihat riwayat lokasinya baik menggunakan
visualisasi peta seperti pada gambar 4.28 maupun
dalam bentuk daftar seperti pada gambar 4.29.
Setiap kita meletakkan mengklik salah satu ikon
tersebut, maka aplikasi menjelaskan informasi ikon
tersebut seperti yang dapat dilihat dalam gambar 4.28.
Manajemen juga dapat melihat detail informasi dalam
bentuk list apabila tombol list ditekan sehingga muncul
tampilan seperti gambar 4.29.
69
4.4 Diverge
Tujuan dari tahapan ini adalah mengeksplorasi sebanyak
mungkin ide yang bisa dijadikan solusi untuk produk. Ide-ide
tersebut bisa realistis ataupun tidak, namun dari ide-ide yang
muncul, kita memiliki wawasan mana yang lebih baik. Dengan
begitu saat memilih salah satu dari banyak ide tersebut, kita
sudah lebih percaya diri karena sudah memastikan tidak ada
yang lebih baik dari itu. Lain hal apabila hanya memikirkan 1
ide saja, kita tidak yakin apakah ide itu sudah yang terbaik atau
tidak.
4.4.1 Ide 1
4.4.1.1 Smartphone Manajemen Perusahaan
(Lampiran 1)
71
4.4.2 Ide 2
4.4.2.1 Smartphone Manajemen Perusahaan
(Lampiran 4)
4.4.3 Ide 3
4.4.3.1 Smartphone Manajemen Perusahaan
(Lampiran 7)
4.5 Converge
4.5.1 Asumsi/ Tabel uji
Semua asumsi dan kemungkinan dalam sistem harus dianalisa
untu meminimalisir bug. Setelah semua asumsi dikumpulkan,
72
Asumsi Pengujian
Kondisi database di tiap - Mengecek kondisi di
perangkat saat tidak masing-masing online
terhubung dengan internet Firebase, smartphone
manajemen perusahaan,
desktop manajemen
perusahaan, dan
smartphone sopir
Form penerimaan barang - Cek koneksi, kapasitas
sudah terisi, namun tidak tersisa dari Firebase, dan
masuk ke database bug
Kode token aman dari sopir - Cek hak akses untuk
melihat token
Sopir hanya bisa login - Login dengan akun
dengan akun yang sudah perusahaan, password
dibuat perusahaan salah, dan akun dummy
(Username dan password
yang sesuai)
4.6 Prototype
4.6.1 Smartphone Manajemen Perusahaan
Desain-desain untuk smartphone manajemen perusahaan
dijabarkan pada Tabel 4-6. Prototype yang dirancang adalah
fungsi-fungsi utama yang harus ada agar semua fungsi sesuai
dengan user story pada Tabel 4-3 dapat dijalankan. Deain
prototype merupakan hasil adopsi dari Ide 3 pada lampiran 8
dokumen ini.
83
Log in Sign up
Login website
5 BAB 5
IMPLEMENTASI
Pada bab ini akan dijelaskan proses tahap implementasi aplikasi
Fleet Monitoring System. Pembahasan yang dilakukan pada bab
ini difokuskan pada lingkungan implementasi, struktur
database, serta penulisan kode program.
Fleemo
users
Fleet
task
departure
message
warehouse
Users
companyID
address
Latitude
Longitude
fullname
password
phone_number
token
companyID
warehouse
warehouseID
address
Latitude
Longitude
companyID
name
warehouseID
Fleet
fleetID
address
Latitude
Longitude
birthdate
companyID
departureID
fullname
gender
isSignUp
license
location
Latitude
longitude
password
phone
token
truckName
truckPlate
working
fleetID
task
taskID
address
Latitude
Longitude
companyID
customer
departureID
fleetID
isCompleted
location
locationID
Latitude
longitude
locationID
message
messageID
actual
item
target
messageID
warehouseLoc
latitude
longitude
warehouseName
token
workType
taskID
message
companyID
fleetID
messageID
customer
departureID
isRead
Location
Latitude
Longitude
newDriver
reason
response
returnOfGood
taskID
type
companyID
departure
departureID
fleetID
isDepartureCompleted
isWorking
task
taskID
isTaskCompleted
taskID
taskID
taskWorking
departureID
.
data email dari armada dan perusahaan saat login. Rule yang
digunakan adalah seperti gambar 5.8 berikut:
{
"rules": {
"fleemo":{
"departure": {
".read": "auth !== null",
".write": "auth !== null"
},
"message": {
".read": "auth !== null",
".write": "auth !== null"
},
"task": {
".read": "auth !== null",
".write": "auth !== null"
},
"temp_task": {
".read": "auth !== null",
".write": "auth !== null"
},
"fleet": {
".read": true,
".write": "auth !== null"
},
"users": {
".write": "auth !== null",
".read": true,
},
"warehouse": {
".read": "auth !== null",
".write": "auth !== null"
}
}
}
}
Gambar 5.8 Rule firebase
107
Virtual Machine
Nama perangkat Nexus 5
Processor Multi-Core 4 CPUs
Memory 1536 MB
Sistem Operasi Android API 24 x86 Nougat
Resolusi 5.2” 1080x1920 xxhdpi
Perangkat Nyata
Nama perangkat Samsung A5 2016
Processor Samsung Exynos Octa 7580
1.60GHz
Memory 1827MB
Sistem Operasi Android API 24 x86 Nougat
Resolusi 5.2” 1080x1920 xxhdpi
if(user != null){
token =
FirebaseInstanceId.getInstance().getToken();
uID = user.getUid();
new
FireDataUserCompany().writeUserToken(uID, token, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference) {
startActivity(new
Intent(FlashActivity.this, HomeActivity.class));
finish();
}
});
}
else{
startActivity(new
Intent(FlashActivity.this, SignInActivity.class));
finish();
}
}
Gambar 5.9 Kode US-AM1-1: Mengecek user login
latitude =
Double.parseDouble(data.getStringExtra("latitude"));
longitude =
Double.parseDouble(data.getStringExtra("longitude"));
latLng = new LatLng(latitude, longitude);
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());
try {
addresses = geocoder.getFromLocation(latitude,
longitude,1);
address = addresses.get(0).getAddressLine(0);
et_add_company_address.setText(address);
} catch (IOException e) {
e.printStackTrace();
}
Gambar 5.12 US-AM1-1: Mengambil dan menkonversi data
alamat
111
setValue();
if(TextUtils.isEmpty(fullName)){
Toast.makeText(this,"Please enter Full Name",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(email)){
Toast.makeText(this,"insert Email",
Toast.LENGTH_SHORT).show();
return;
}
else{
String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-
Z]{2,4}$";
Pattern pattern = Pattern.compile(expression,
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(email);
if(!matcher.matches()){
Toast.makeText(this,"email format invalid",
Toast.LENGTH_SHORT).show();
return;
}
}
if(TextUtils.isEmpty(password1)){
Toast.makeText(this,"insert Password",
Toast.LENGTH_SHORT).show();
return;
}
else if(password1.length()<6){
Toast.makeText(this,"Password minimum character:
6", Toast.LENGTH_SHORT).show();
}
if(TextUtils.isEmpty(password2)){
Toast.makeText(this,"re-insert your password",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(phoneNumber)){
Toast.makeText(this,"insert Phone Number",
Toast.LENGTH_SHORT).show();
return;
}
if(latLng==null){
Toast.makeText(this,"Set address with a map",
112
Toast.LENGTH_SHORT).show();
return;
}
if(!password1.equals(password2)){
Toast.makeText(this,"the passwords you typed didn't
match" , Toast.LENGTH_SHORT).show();
return;
}
else{
//Sign Up
}
try{
mAuth.createUserWithEmailAndPassword(email,password1).a
ddOnCompleteListener(this, new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull
Task<AuthResult> task) {
if(task.isSuccessful()){
Toast.makeText(SignUpActivity.this,
"Account Registered successfully",
Toast.LENGTH_SHORT).show();
final FirebaseUser user =
mAuth.getCurrentUser();
new
FireDataUserCompany().writeUser(user.getUid(),
fullName, email, password1, phoneNumber, latLng, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
startActivity(new
Intent(SignUpActivity.this, HomeActivity.class));
finish();
}
else{
Toast.makeText(SignUpActivity.this, "Registration
error, please try again : " +
databaseError.getDetails(), Toast.LENGTH_SHORT).show();
}
}
});
}
else {
Toast.makeText(SignUpActivity.this,
"Registration error, please try again : " +
task.getException(), Toast.LENGTH_SHORT).show();
return;
}
}
});
}
catch (Throwable t){
t.printStackTrace();
AlertDialog alertDialog = new
AlertDialog.Builder(this).create();
114
alertDialog.setTitle("Error");
alertDialog.setMessage("Application running on
Android 4.4 and above");
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL,
"OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface
dialog, int which) {
dialog.dismiss();
}
});
alertDialog.show();
return;
}
Gambar 5.15 US-AM1-1: Fungsi Sign up
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserCompany().ref.addValueEventListener(emailEv
entListener);
}
Gambar 5.17 US-AS1-2: Mengambil email company
startActivity(new Intent(SignInActivity.this,
117
HomeActivity.class));
finish();
}
});
}
});
}
else {
Toast.makeText(SignInActivity.this, "Password is
incorrect", Toast.LENGTH_LONG).show();
return;
}
}
}).addOnFailureListener(new
OnFailureListener() {
@Override
public void onFailure(@NonNull
Exception e) {
Toast.makeText(getApplicationContext(), e.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
break;
}
if(i==emailList.size()-1){
if(!email.equals(emailList.get(i))){
if(FirebaseAuth.getInstance().getCurrentUser()==null){
Toast.makeText(this, "Email not
registered", Toast.LENGTH_SHORT).show();
return;
}
}
}
}
}
}
VisibleRegion visibleRegion =
mMap.getProjection().getVisibleRegion();
Point x =
mMap.getProjection().toScreenLocation(visibleRegion.far
Right);
Point y =
mMap.getProjection().toScreenLocation(visibleRegion.nea
rLeft);
Point centerPoint = new Point(x.x / 2, y.y / 2);
centerFromPoint =
mMap.getProjection().fromScreenLocation(centerPoint);
//mMap.addMarker(new
MarkerOptions().position(centerFromPoint)).setTitle("ok
e");
Log.d("tsss","center from point: " +
centerFromPoint.toString());
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this, Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(centerFromPoint.latitude,
centerFromPoint.longitude,1);
String address =
addresses.get(0).getAddressLine(0);
Log.d("tsss", "Cordinate: "+
centerFromPoint.latitude + " : " +
centerFromPoint.longitude);
Log.d("tsss", "address: " + address);
catch (IOException e) {
e.printStackTrace();
}
}
Gambar 5.20 US-AM1-3: Set lokasi sopir
120
if(matcher.matches()){
String value = matcher.group(0);
int month = Integer.parseInt(value.substring(0,2));
int day = Integer.parseInt(value.substring(3,5));
int year = Integer.parseInt(value.substring(6));
Log.d("tsss","Value: "+ month + " : " + day + " : "
+ year);
else{
if(day>28){
Log.d("tsss", "birthdate check: false
month 2 date 29,30,31");
return false;
}
else{
return true;
}
}
}
else if(month<0 || month >12){
return false;
}
else{
return true;
}
}
else{
Log.d("tsss", "matcher no match");
return false;
}
}
if(TextUtils.isEmpty(fullname)){
Toast.makeText(this, "Please enter Full Name",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(email)){
Toast.makeText(this, "Please enter Email",
Toast.LENGTH_SHORT).show();
return;
}
else{
String expression = "^[\\w\\.-]+@([\\w\\-]+\\.)+[A-
Z]{2,4}$";
Pattern pattern = Pattern.compile(expression,
Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(email);
if(!matcher.matches()){
Toast.makeText(this, "email format invalid",
Toast.LENGTH_SHORT).show();
return;
}
}
123
if(TextUtils.isEmpty(password1)){
Toast.makeText(this, "Please enter Password",
Toast.LENGTH_SHORT).show();
return;
}
else if(password1.length()<6){
Toast.makeText(this, "Password minimum character:
6", Toast.LENGTH_SHORT).show();
}
if(TextUtils.isEmpty(password2)){
Toast.makeText(this, "Please re-enter Password",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(license)){
Toast.makeText(this, "Please enter License",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(phoneNumber)){
Toast.makeText(this, "Please enter Phone Number",
Toast.LENGTH_SHORT).show();
return;
}
if(latLng==null){
Toast.makeText(this, "Set address with a map",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(address)){
Toast.makeText(this, "Please enter Address",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(gender)){
Toast.makeText(this, "Please enter Gender",
Toast.LENGTH_SHORT).show();
return;
}
else{
String _gender = gender.trim().toLowerCase();
if(!_gender.equals("male") &&
!_gender.equals("female")) {
Toast.makeText(this, "gender format invalid",
124
Toast.LENGTH_SHORT).show();
return;
}
}
if(TextUtils.isEmpty(birthDate)){
Toast.makeText(this, "Please enter Birth Date",
Toast.LENGTH_SHORT).show();
return;
}
else{
if(!validate(birthDate)){
Toast.makeText(this, "birth date format
invalid", Toast.LENGTH_SHORT).show();
return;
}
}
if(TextUtils.isEmpty(truckName)){
Toast.makeText(this, "Please enter Truck Name",
Toast.LENGTH_SHORT).show();
return;
}
if(TextUtils.isEmpty(truckPlate)){
Toast.makeText(this, "Please enter Truck Plate",
Toast.LENGTH_SHORT).show();
return;
}
if(!password1.equals(password2)){
Toast.makeText(this, "The password you typed didn't
match", Toast.LENGTH_SHORT).show();
return;
}
else{
if(emailList.contains(email)){
Toast.makeText(this, "this email is already
registered", Toast.LENGTH_SHORT);
}
else{
addFleetFirebase();
}
}
}
Gambar 5.22 US-AM1-3: Memastikan semua data telah terisi
125
Toast.makeText(FleetRegistration.this, "Registration
Completed ", Toast.LENGTH_SHORT).show();
finish();
}
else{
Toast.makeText(FleetRegistration.this, "Registration
error : "
+
databaseError.getDetails(), Toast.LENGTH_SHORT).show();
}
}
});
}
ModelCompany company =
dataSnapshot.getValue(ModelCompany.class);
ModelAddress modelAddress =
dataSnapshot.child("address").getValue(ModelAddress.cla
ss);
Geocoder geocoder;
List<Address> _address;
geocoder = new Geocoder(getContext(),
Locale.getDefault());
try {
_address =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
address =
_address.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
tv_ID_Fill.setText(company.getFullname());
txt_email.setText(company.getEmail());
txt_address.setText(address);
txt_password.setText("companyPassword");
txt_phone.setText(company.getPhonenumber());
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserCompany().ref.child(user.getUid()).addListe
nerForSingleValueEvent(singleEventListener);
}
Gambar 5.24 US-AM1-4: Mengambil data perusahaan
127
2. Password akun
Password akun bisa diganti apabila sudah mengisikan
password lama pada EditText dan cocok dengan password
yang ada di database. Selain itu, password baru harus
diketikkan 2 kali untuk memastikan user mengetikkan
password sesuai dengan yang ia inginkan. Kode yang
diguanakan pada gambar 5.27. Sama dengan mengedit
email perusahaan, password akun harus diedit pada
database dan otentikasi, juga harus diedit pada sesi yang
sama dengan login. Kode yang digunakan adalah pada
gambar 5.28. Email yang dimasukkan user akan dicek
langsung dari Firebase dengan batasan password adlah
minimal 6 karakter
129
Toast.makeText(Company_Edit_Email.this, "Error
while updating : " + databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
user.updateEmail(newEmail).addOnCompleteListener(ne
w OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void>
task) {
if(task.isSuccessful()){
updateDatabaseEmail();
finish();
}
else{
Toast.makeText(getApplicationContext(),"Error
updating. Please log out then log in again",
Toast.LENGTH_LONG).show();
}
}
}).addOnFailureListener(new OnFailureListener()
{
@Override
public void onFailure(@NonNull Exception e)
{
return;
}
});
}
newEmail = et_edit_email.getText().toString();
if(TextUtils.isEmpty(newEmail)){
Toast.makeText(this, "new email is empty",
Toast.LENGTH_SHORT).show();
return;
}
else{
String expression = "^[\\w\\.-]+@([\\w\\-
]+\\.)+[A-Z]{2,4}$";
Pattern pattern =
Pattern.compile(expression,
Pattern.CASE_INSENSITIVE);
Matcher matcher =
pattern.matcher(newEmail);
if(matcher.matches()){
updateAuthEmail();
}
else{
Toast.makeText(this, "input format
invalid", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserCompany().ref.child(user.getUid()).addListene
rForSingleValueEvent(valueEventListener);
}
if(TextUtils.isEmpty(oldPassword)){
Toast.makeText(this, "old password is empty",
Toast.LENGTH_SHORT).show();
return;
}
else if(!oldPassword.equals(savedOldPassword)){
Toast.makeText(this, "old password didn't match",
Toast.LENGTH_SHORT).show();
}
else if(TextUtils.isEmpty(password1)){
Toast.makeText(this, "Please enter new password",
Toast.LENGTH_SHORT).show();
return;
}
else if(password1.length()<6){
Toast.makeText(this, "Password minimum character:
6", Toast.LENGTH_SHORT).show();
}
else if(TextUtils.isEmpty(password2)){
Toast.makeText(this, "retype your new password",
Toast.LENGTH_SHORT).show();
return;
}
else if(!password1.equals(password2)){
Toast.makeText(this, "new password didn't match",
132
Toast.LENGTH_SHORT).show();
return;
}
else{
updateAuthPassword();
}
}
4. alamat perusahaan
Untuk mengedit alamat perusahaan, langkahnya adalah
mengambil kordinat lokasi menggunakan Aktivitas
Account_Set_Map, lalu menyimpannya dalam database,
menggunakan kode pada gambar 5.30.
5. nama perusahaan
Untuk mengedit nama perusahaan, langkahnya hanya
mengambil teks yang ada dalam EditText lalu
menyimpannya dalam database, menggunakan kode pada
gambar 5.31.
133
user.updatePassword(password1).addOnCompleteListene
r(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void>
task) {
if(task.isSuccessful()){
Log.d("tsss","authentication update
success");
updateDatabasePassword();
}
else{
Toast.makeText(getApplicationContext(),"Error
updating. Please log out then log in again",
Toast.LENGTH_LONG).show();
return;
}
}
});
}
Toast.makeText(Company_Edit_Password.this, "Error
while updating : " + databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
Gambar 5.28 US-AM1-4: Edit password perusahaan
134
@OnClick(R.id.btn_save_company_phonenumber) public
void savePhone(){
newPhone =
et_edit_phonenumber.getText().toString();
if(TextUtils.isEmpty(newPhone)){
Toast.makeText(this, "new phone number is
empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUserCompany().writeUserPhoneNumber(user.get
Uid(), newPhone, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError == null){
finish();
}
else{
Toast.makeText(Company_Edit_Phone.this, "Error
while updating : " + databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
finish();
}
Gambar 5.29 US-AM1-4: Edit nomor telepon perusahaan
135
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this,
Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(latitude, longitude,1);
address =
addresses.get(0).getAddressLine(0);
et_edit_address.setText(address);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
{
if(databaseError == null){
finish();
}
else{
Toast.makeText(Company_Edit_Address.this, "Error
while updating : " + databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
}
Gambar 5.30 US-AM1-4: Edit alamat perusahaan
@OnClick(R.id.btn_save_company_fullname) public
void saveName(){
newName =
et_edit_fullname.getText().toString();
if(TextUtils.isEmpty(newName)){
Toast.makeText(this, "new company name is
empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUserCompany().writeUserFullName(user.getUid
(), newName, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError == null){
finish();
}
else{
tv_ID_Fill.setText(fleet.getEmail());
txt_full_name.setText(fleet.getFullname());
txt_email.setText(fleet.getEmail());
txt_password.setText("yourpassword");
txt_licence.setText(fleet.getLicense());
txt_phone.setText(fleet.getPhone());
txt_address.setText(address);
txt_gender.setText(fleet.getGender());
txt_birthdate.setText(fleet.getBirthdate());
txt_truckname.setText(fleet.getTruckName());
txt_truckplate.setText(fleet.getTruckPlate());
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserFleet().ref.child(message).addListenerForSi
ngleValueEvent(singleEventListener);
Gambar 5.33 US-AM1-5: Mengambil data armada
1. Nama lengkap
Untuk mengedit nama lengkap sopir, langkahnya adalah
mengambil teks yang ada dalam EditText lalu
menyimpannya dalam databsae, menggunakan kode pada
gambar 5.34.
@OnClick(R.id.btn_save_driver_fullname) public void
saveName(){
newName =
et_edit_fullname.getText().toString();
if(TextUtils.isEmpty(newName)){
Toast.makeText(this, "new Name is empty",
Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUserFleet().writeUserFullName(message,
newName, new DatabaseReference.CompletionListener()
{
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError == null){
finish();
}
else{
2. Lisensi SIM
Untuk mengedit lisensi sopir, langkahnya adalah
mengambil teks yang ada dalam EditText lalu
menyimpannya dalam database, menggunakan kode pada
gambar 5.35.
@OnClick(R.id.btn_save_driver_license) public void
saveLicense(){
newLicense =
et_edit_license.getText().toString();
if(TextUtils.isEmpty(newLicense)){
Toast.makeText(this, "new driver license is
empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUserFleet().writeUserLicense(message,
newLicense, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError == null){
finish();
}
else{
Toast.makeText(Fleet_Edit_DriverLicense.this,
"Error while updating : " +
databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
}
Gambar 5.35 US-AM1-5: Edit nomor lisensi SIM sopir
3. Nomor telepon
Untuk mengedit nomor telepon, langkahnya adalah
mengambil teks yang ada dalam EditText lalu
menyimpannya dalam database. Namun belum ada aturan
141
if(TextUtils.isEmpty(newPhone)){
Toast.makeText(this, "new phone number is
empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUserFleet().writeUserPhone(message,
newPhone, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError == null){
finish();
}
else{
4. Alamat lengkap
Untuk mengedit alamat lengkap, langkahnya adalah
mengambil kordinat lokasi menggunakan akticitas
Account_Set_Map. Setelah didapatkan lalu
menyimpannya ke dalam database menggunakan kode
pada gambar 5.37.
142
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this,
Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(latitude, longitude,1);
address =
addresses.get(0).getAddressLine(0);
et_edit_address.setText(address);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
{
if(databaseError == null){
finish();
}
else{
Toast.makeText(Fleet_Edit_Address.this, "Error
while updating : " + databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
}
Gambar 5.37 US-AM1-5: Edit alamat lengkap sopir
5. Jenis Kelamin
Untuk megedit jenis kelamin, aplikasi mengambil teks
yang ada dalam EditText yang berisi nilai “female” atau
“male”, lalu menyimpannya ke dalam database. Ada
aturan yang melarang user saat mengisikan teks selain
“male”atau “female” tersebut. Kode yang digunakan
adalah pada gambar 5.38.
6. Tanggal lahir
Untuk mengedit tanggal lahir, langkahnya adalah
mengambil teks yang ada dalam EditText dengan format
(MM/DD/YYYY). Ada aturan yang melarang apabila
format penulisan tanggal salah. Kode yang digunakan
adalah pada gambar 5.39.
7. Nama truk
Untuk mengedit nama truk, langkahnya adalah mengambil
teks yang ada dalam EditText, lalu menyimpannya dalam
database menggunakan kode pada gambar 5.40
8. Nomor plat truk
Untuk mengedit nomor plat truk, langkahnya adalah
mengambil teks yang ada dalam EditText setelah user
mengisikan nomor platnya. Namun belum ada aturan yang
melarang user saat mengisikan teks dengan nomor plat
144
if(matcher.matches()){
String value = matcher.group(0);
int month =
Integer.parseInt(value.substring(0,2));
int day =
Integer.parseInt(value.substring(3,5));
int year =
Integer.parseInt(value.substring(6));
Log.d("tsss","Value: "+ month + " : " + day
+ " : " + year);
}
else if(month<0 || month >12){
return false;
}
else{
return true;
}
}
else{
Log.d("tsss", "matcher no match");
return false;
}
}
if(TextUtils.isEmpty(newBirthDate)){
Toast.makeText(this, "new birth date is
empty", Toast.LENGTH_SHORT).show();
return;
}
else if(newBirthDate.length()!=10){
Toast.makeText(Fleet_Edit_BirthDate.this,
"input format invalid", Toast.LENGTH_SHORT).show();
}
else{
if(validate(newBirthDate)){
new
FireDataUserFleet().writeUserBirthDate(message,
newBirthDate, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
Toast.makeText(Fleet_Edit_BirthDate.this, "Error
while updating : " + databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
else{
147
Toast.makeText(Fleet_Edit_BirthDate.this, "input
format invalid", Toast.LENGTH_SHORT).show();
}
}
}
@OnClick(R.id.btn_save_driver_vehiclename)
public void saveName(){
newFleetName =
et_edit_vehiclename.getText().toString();
if(TextUtils.isEmpty(newFleetName)){
Toast.makeText(this, "new vehicle
name is empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUserFleet().writeUserTruckName(messag
e, newFleetName, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
Toast.makeText(Fleet_Edit_TruckName.this,
"Error while updating : " +
databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
}
@OnClick(R.id.btn_save_driver_licenseplate) public
void savePlate(){
newPlate =
et_edit_licenseplate.getText().toString();
if(TextUtils.isEmpty(newPlate)){
Toast.makeText(this, "new vehichle plate
number is empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUserFleet().writeUserTruckPlate(message,
newPlate, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError == null){
finish();
}
else{
}
Gambar 5.43 US-AM2-1: Implements
onItemSelectedListener
Sebelum bisa memilih data dari spinner, data harus diambil dari
Firebase dimasukkan ke dalam list yang nantinya akan
digunakan spinner. Kode yang digunakan untuk mengambil
150
driverAvailabilityList.add(fleet);
driverAvailabilityList1.add(fleet.getFullname());
}
}
android.R.layout.simple_spinner_dropdown_item,
driverAvailabilityList1);
dataAdapter.setDropDownViewResource(android.R.layout
.simple_spinner_dropdown_item);
spin_driver.setAdapter(dataAdapter);
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
151
ModelFleet _fleet =
dataSnapshot.getValue(ModelFleet.class);
String isSignUp =
dataSnapshot.child(FireDataUserFleet.IS_SIGNUP).getV
alue().toString();
String tmpAdmin =
dataSnapshot.child(FireDataUserFleet.COMPANY_ID).get
Value().toString();
ModelFleet fleet = new
ModelFleet(dataSnapshot.getKey(),
_fleet.getFullname());
if(companyID.equals(tmpAdmin)){
if(isSignUp.equals("true")){
if(driverAvailabilityList.contains(fleet)){
driverAvailabilityList.remove(fleet);
}
if(driverAvailabilityList1.contains(fleet.getFullnam
e())){
driverAvailabilityList1.remove(fleet.getFullname());
}
driverAvailabilityList.add(fleet);
driverAvailabilityList1.add(fleet.getFullname());
}
}
android.R.layout.simple_spinner_dropdown_item,
driverAvailabilityList1);
dataAdapter.setDropDownViewResource(android.R.layout
.simple_spinner_dropdown_item);
spin_driver.setAdapter(dataAdapter);
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
ModelFleet _fleet =
152
dataSnapshot.getValue(ModelFleet.class);
ModelFleet fleet = new
ModelFleet(dataSnapshot.getKey(),
_fleet.getFullname());
driverAvailabilityList.remove(fleet);
driverAvailabilityList1.remove(fleet.getFullname());
android.R.layout.simple_spinner_dropdown_item,
driverAvailabilityList1);
dataAdapter.setDropDownViewResource(android.R.layout
.simple_spinner_dropdown_item);
spin_driver.setAdapter(dataAdapter);
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserFleet().ref.addChildEventListener(driver
EventListener);
spin_driver.setOnItemSelectedListener(this);
}
if(_modelWarehouse.getCompanyID().equals(user.getUid())
){
ModelAddress modelAddress =
postSnapshot.child("address").getValue(ModelAddress.cla
ss);
LatLng latlngx = new
LatLng(modelAddress.getLatitude(),
modelAddress.getLongitude());
ModelWarehouse modelWarehouse =
new ModelWarehouse(postSnapshot.getKey(),
_modelWarehouse.getName(), latlngx);
warehouseList.add(modelWarehouse);
warehouseList1.add(modelWarehouse.getName());
ArrayAdapter<String>
dataAdapter = new
ArrayAdapter<>(getActivity().getApplicationContext(),
android.R.layout.simple_spinner_dropdown_item,
warehouseList1);
dataAdapter.setDropDownViewResource(android.R.layout.si
mple_spinner_dropdown_item);
spin_wareHouse.setAdapter(dataAdapter);
Log.d("tsss", "warehouse from
firebase: "+modelWarehouse.getName());
}
}
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
154
}
};
new
FireDataWareHouse().ref.addValueEventListener(wareHouse
EventListener);
spin_wareHouse.setOnItemSelectedListener(this);
}
Gambar 5.45 US-AM2-1: Mengambil data gudang dari
Firebase
@Override
public void onItemSelected(AdapterView<?> parent,
View view, int position, long id) {
Spinner spinner = (Spinner) parent;
if(spinner.getId() == R.id.spin_driver){
spin_driver.setSelection(position);
fleetID =
driverAvailabilityList.get(position).getID();
}
if(spinner.getId() == R.id.spin_wareHouse){
spin_wareHouse.setSelection(position);
wareHouseName =
warehouseList.get(position).getName();
wareHouseLoc =
warehouseList.get(position).getLatLng();
}
}
Gambar 5.46 US-AM2-1: onItemSelectedListener
155
List barang yang akan diantar diketikkan oleh user. Tiap barang
diisikan dalam 1 card yang dimuat dalam LinearLayout
ll_product yang letaknya diatas FloatingButton btn_add atau
pada gambar 5.24 berbentuk garis biru horizontal panjang. Pada
awal aktivitias dimulai, card hanya ada 1 untuk mengisikan 1
produk, jika ingin menambahkan lebih banyak produk, makan
harus menekan btn_add yang akan menjalankan fungsi card()
dengan kode seperti gambar 5.47.
ll_product.addView(canvasProduct);
ll_product.requestLayout();
}
Gambar 5.47 US-AM2-1: Menambah Card Produk
else if(latLng==null){
Toast.makeText(getContext(), "Please choose
location with map", Toast.LENGTH_SHORT).show();
return;
}
else{
for(int i = 0; i< messageList.size(); i++){
String id = messageList.get(i).getId() +
"";
String item =
messageList.get(i).getEtItem().getText() + "";
String amount =
messageList.get(i).getEtTarget().getText() + "";
objectMessage.put(FireDataTask.MESSAGE_VALUE_ITEM,
item);
objectMessage.put(FireDataTask.MESSAGE_VALUE_TARGET,
amount);
messageMap.put(id, objectMessage);
if(i == messageList.size()-1){
new
FireDataTask().writeNewTask(companyID, wareHouseName,
wareHouseLoc, fleetID, latLng, customer, token,
messageMap,
new
DatabaseReference.CompletionListener(){
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
Toast.makeText(getActivity(),"Task succesfully
created", Toast.LENGTH_SHORT).show();
157
et_edit_customer.setText("");
et_edit_address.setText("");
et_edit_token.setText("");
messageList.clear();
messageMap.clear();
listSize=0;
ll_product.removeAllViews();
card();
}
});
}
}
}
}
Gambar 5.48 US-AM2-1: Membuat penugasan baru
1. FleetStatusList
Pada fragment ini, data yang ditampilkan hanya tentang
armada dengan informasi yang ditampilkan yakni: nama
sopir, bekerja/tidak bekerja, dan lokasi terkini sopir.
Semua data ini tersedia pada 1 ranting Fleet di Firebase
jadi hanya perlu mengambil 1 data saja. Pengambilan data
menggunakan fungsi pada gambar 5.49.
158
if(adminKey.equals(dataSnapshot.child("companyID").
getValue().toString())){
if(dataSnapshot.child("isSignUp").getValue().toStri
ng().equals("true")){
String key =
dataSnapshot.getKey();
ModelFleet fleet =
dataSnapshot.getValue(ModelFleet.class);
ModelAddress modelAddress =
dataSnapshot.child("location").getValue(ModelAddres
s.class);
if(modelAddress != null){
String location=null;
String driverName =
fleet.getFullname();
boolean isWorking =
fleet.isWorking();
String workingStatus;
if(isWorking==true)
workingStatus = "delivering order";
else workingStatus =
"idling/available";
Geocoder geocoder;
List<Address> _address;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
_address =
geocoder.getFromLocation(modelAddress.getLatitude()
, modelAddress.getLongitude(),1);
location =
_address.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
fleetListMap.put(key, new
ModelFleetList(driverName,workingStatus,location));
mAdapter.notifyDataSetChanged();
}
checkEmpty();
}
}
159
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
if(adminKey.equals(dataSnapshot.child("companyID").
getValue().toString())){
if(dataSnapshot.child("isSignUp").getValue().toStri
ng().equals("true")){
String key =
dataSnapshot.getKey();
ModelFleet fleet =
dataSnapshot.getValue(ModelFleet.class);
ModelAddress modelAddress =
dataSnapshot.child("location").getValue(ModelAddres
s.class);
if(modelAddress != null){
String location=null;
String driverName =
fleet.getFullname();
boolean isWorking =
fleet.isWorking();
String workingStatus;
if(isWorking==true)
workingStatus = "delivering order";
else workingStatus =
"idling/available";
Geocoder geocoder;
List<Address> _address;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
_address =
geocoder.getFromLocation(modelAddress.getLatitude()
, modelAddress.getLongitude(),1);
location =
_address.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
fleetListMap.put(key, new
ModelFleetList(driverName,workingStatus,location));
mAdapter.notifyDataSetChanged();
}
checkEmpty();
}
160
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
String key = dataSnapshot.getKey();
fleetListMap.remove(key);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserFleet().ref.addChildEventListener(fleet
EventListener);
}
recyclerview_fleet.setLayoutManager(mLayoutManag
er);
recyclerview_fleet.setItemAnimator(new
DefaultItemAnimator());
recyclerview_fleet.setAdapter(mAdapter);
checkEmpty();
}
recyclerview_fleet.setVisibility(View.VISIBLE);
tv_emptyFleet.setVisibility(View.GONE);
}
else {
recyclerview_fleet.setVisibility(View.GONE);
tv_emptyFleet.setVisibility(View.VISIBLE);
}
}
Gambar 5.50 US-AM2-2: set Adapter pada recycler view
@BindView(R.id.tv_driverName) TextView
tv_driverName;
@BindView(R.id.tv_workingStatus) TextView
tv_workingStatus;
@BindView(R.id.tv_location) TextView tv_location;
@BindView(R.id.rlCard) LinearLayout rlCard;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
View view =
LayoutInflater.from(parent.getContext()).
inflate(R.layout.card_fleet_list,parent,
false);
@Override
public void
onBindViewHolder(FleetListAdapter.MyViewHolder holder,
int position) {
final List<String> keyList = new
ArrayList<>(fleetList.keySet());
final List<ModelFleetList> fleetLists = new
ArrayList<>(fleetList.values());
ModelFleetList fleet = fleetLists.get(position);
holder.tv_driverName.setText(fleet.getFullname());
holder.tv_workingStatus.setText(fleet.getWorkingStatus(
));
holder.tv_location.setText(fleet.getLocation());
}
@Override
163
2. FleetStatusMap
Fragment ini memiliki 4 jenis pin dan memiliki tombol
recenter yang memindahkan kamera peta ke lokasi
perusahaan. Pin tersebut adalah pin lokasi perusahaan, pin
gudang, pin armada yang sedang bekerja, dan pin armada
yang tidak bekerja. Untuk menampilkan pin tersebut, ada
3 cabang Firebase yang harus didapatkan dari Firebase
164
companyMarker= mMap.addMarker(new
MarkerOptions().position(latLngCompany).title("Company"
).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_company", 52, 100))));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLn
gCompany, 12));
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserCompany().ref.child(companyID).addListenerF
orSingleValueEvent(companyEventListener);
}
Gambar 5.54 US-AM2-2: Mengambil data company dari
Firebase
166
if(companyID.equals(fleet.getcompanyID())){
if(dataSnapshot.child("isSignUp").getValue().toString
().equals("true")){
String fullname =
fleet.getFullname();
boolean isWorking =
fleet.isWorking();
ModelAddress modelAddress =
dataSnapshot.child("location").getValue(ModelAddress.
class);
if(modelAddress !=null){
ModelFleet modelFleet = new
ModelFleet(isWorking,fullname,
modelAddress.getLatitude(),
modelAddress.getLongitude());
fleetlist.add(modelFleet);
for(int i=0;
i<fleetlist.size();i++){
String tempFleetName =
fleetlist.get(i).getFullname();
LatLng tempFleetLatLng =
new LatLng(fleetlist.get(i).getLat(),
fleetlist.get(i).getLng());
boolean tempIsWorking =
fleetlist.get(i).isWorking();
if(tempIsWorking==true){
fleetMarker =
mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempF
leetName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_fleet_current_location_2", 47, 80))));
}
else{
fleetMarker =
mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempF
leetName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_fleet_current_location", 47, 80))));
167
}
}
}
}
}
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
mMap.clear();
fleetlist.clear();
//return warehouse marker
for(int i=0; i<wareHouseList.size();i++){
String tempWareHouseName =
wareHouseList.get(i).getName();
LatLng tempWareHouseLatLng =
wareHouseList.get(i).getLatLng();
wareHouseMarker = mMap.addMarker(new
MarkerOptions().position(tempWareHouseLatLng).title(t
empWareHouseName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_warehouse", 42, 80))));
}
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_company", 52, 100))));
if(companyID.equals(postSnapshot.child("companyID").g
etValue().toString())) {
if
(postSnapshot.child("isSignUp").getValue().toString()
.equals("true")) {
ModelFleet fleet =
postSnapshot.getValue(ModelFleet.class);
String fullname =
fleet.getFullname();
168
boolean isWorking =
fleet.isWorking();
ModelAddress
modelAddress =
postSnapshot.child("location").getValue(ModelAddress.
class);
if(modelAddress
!=null){
ModelFleet
modelFleet = new ModelFleet(isWorking,fullname,
modelAddress.getLatitude(),
modelAddress.getLongitude());
fleetlist.add(modelFleet);
for(int i=0;
i<fleetlist.size();i++){
String
tempFleetName = fleetlist.get(i).getFullname();
LatLng
tempFleetLatLng = new
LatLng(fleetlist.get(i).getLat(),
fleetlist.get(i).getLng());
boolean
tempIsWorking = fleetlist.get(i).isWorking();
if(tempIsWorking==true){
fleetMarker = mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempF
leetName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_fleet_current_location_2", 47, 80))));
}
else{
fleetMarker = mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempF
leetName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_fleet_current_location", 47, 80))));
}
}
}
}
}
}
}
@Override
169
}
};
new
FireDataUserFleet().ref.addValueEventListener(fleetEv
entListener2);
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
mMap.clear();
fleetlist.clear();
//return warehouse marker
for(int i=0; i<wareHouseList.size();i++){
String tempWareHouseName =
wareHouseList.get(i).getName();
LatLng tempWareHouseLatLng =
wareHouseList.get(i).getLatLng();
wareHouseMarker = mMap.addMarker(new
MarkerOptions().position(tempWareHouseLatLng).title(t
empWareHouseName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_warehouse", 42, 80))));
}
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_company", 52, 100))));
if(companyID.equals(postSnapshot.child("companyID").g
etValue().toString())) {
if
(postSnapshot.child("isSignUp").getValue().toString()
.equals("true")) {
ModelFleet fleet =
170
postSnapshot.getValue(ModelFleet.class);
String fullname =
fleet.getFullname();
boolean isWorking =
fleet.isWorking();
ModelAddress
modelAddress =
postSnapshot.child("location").getValue(ModelAddress.
class);
if(modelAddress
!=null){
ModelFleet
modelFleet = new ModelFleet(isWorking,fullname,
modelAddress.getLatitude(),
modelAddress.getLongitude());
fleetlist.add(modelFleet);
for(int i=0;
i<fleetlist.size();i++){
String
tempFleetName = fleetlist.get(i).getFullname();
LatLng
tempFleetLatLng = new
LatLng(fleetlist.get(i).getLat(),
fleetlist.get(i).getLng());
boolean
tempIsWorking = fleetlist.get(i).isWorking();
if(tempIsWorking==true){
fleetMarker = mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempF
leetName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_fleet_current_location_2", 47, 80))));
}
else{
fleetMarker = mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempF
leetName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap(
"map_fleet_current_location", 47, 80))));
}
}
}
}
}
}
171
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserFleet().ref.addValueEventListener(fleetEv
entListener2);
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserFleet().ref.addChildEventListener(fleetEv
entListener);
}
Gambar 5.55 US-AM2-2: Mengambil data armada dari
Firebase
if(companyID.equals(_modelWarehouse.getCompanyID())){
ModelAddress addressWareHouse =
dataSnapshot.child(FireDataWareHouse.ADDRESS).getValue(
ModelAddress.class);
String wareHouseName =
_modelWarehouse.getName();
LatLng _temp = new
LatLng(addressWareHouse.getLatitude(),
addressWareHouse.getLongitude());
ModelWarehouse modelWarehouse = new
ModelWarehouse(dataSnapshot.getKey(),wareHouseName,
_temp);
wareHouseList.add(modelWarehouse);
for(int i=0;
i<wareHouseList.size();i++){
String tempWareHouseName =
wareHouseList.get(i).getName();
LatLng tempWareHouseLatLng =
wareHouseList.get(i).getLatLng();
wareHouseMarker =
mMap.addMarker(new
MarkerOptions().position(tempWareHouseLatLng).title(tem
pWareHouseName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_warehouse", 42, 80))));
}
}
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
wareHouseList.clear();
mMap.clear();
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_company", 52, 100))));
173
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_current_location_2", 47, 80))));
}
else{
fleetMarker = mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempFle
etName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_current_location", 47, 80))));
}
}
if(companyID.equals(_modelWarehouse.getCompanyID())){
ModelAddress
addressWareHouse =
postSnapshot.child(FireDataWareHouse.ADDRESS).getValue(
ModelAddress.class);
String wareHouseName =
_modelWarehouse.getName();
LatLng _temp = new
LatLng(addressWareHouse.getLatitude(),
addressWareHouse.getLongitude());
ModelWarehouse
modelWarehouse = new
ModelWarehouse(postSnapshot.getKey(),wareHouseName,
174
_temp);
wareHouseList.add(modelWarehouse);
for(int i=0;
i<wareHouseList.size();i++){
String
tempWareHouseName = wareHouseList.get(i).getName();
LatLng
tempWareHouseLatLng = wareHouseList.get(i).getLatLng();
wareHouseMarker =
mMap.addMarker(new
MarkerOptions().position(tempWareHouseLatLng).title(tem
pWareHouseName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_warehouse", 42, 80))));
}
}
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataWareHouse().ref.addValueEventListener(wareHouse
EventListener2);
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
wareHouseList.clear();
mMap.clear();
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_company", 52, 100))));
LatLng(fleetlist.get(i).getLat(),
fleetlist.get(i).getLng());
boolean tempIsWorking =
fleetlist.get(i).isWorking();
if(tempIsWorking==true){
fleetMarker = mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempFle
etName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_current_location_2", 47, 80))));
}
else{
fleetMarker = mMap.addMarker(new
MarkerOptions().position(tempFleetLatLng).title(tempFle
etName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_current_location", 47, 80))));
}
}
if(companyID.equals(_modelWarehouse.getCompanyID())){
ModelAddress
addressWareHouse =
postSnapshot.child(FireDataWareHouse.ADDRESS).getValue(
ModelAddress.class);
String wareHouseName =
_modelWarehouse.getName();
LatLng _temp = new
LatLng(addressWareHouse.getLatitude(),
addressWareHouse.getLongitude());
ModelWarehouse
modelWarehouse = new
ModelWarehouse(postSnapshot.getKey(),wareHouseName,
_temp);
wareHouseList.add(modelWarehouse);
for(int i=0;
i<wareHouseList.size();i++){
176
String
tempWareHouseName = wareHouseList.get(i).getName();
LatLng
tempWareHouseLatLng = wareHouseList.get(i).getLatLng();
wareHouseMarker =
mMap.addMarker(new
MarkerOptions().position(tempWareHouseLatLng).title(tem
pWareHouseName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_warehouse", 42, 80))));
}
}
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataWareHouse().ref.addValueEventListener(wareHouse
EventListener2);
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataWareHouse().ref.addChildEventListener(wareHouse
EventListener);
}
Gambar 5.56 US-AM2-2: Mengambil data gudang dari
Firebase
177
if(companyID.equals(dataSnapshot.child("companyID").
getValue().toString())){
if(dataSnapshot.child("isCompleted").getValue().toSt
ring().equals("false")){
final String key =
dataSnapshot.getKey();
final ModelTask task =
dataSnapshot.getValue(ModelTask.class);
final ModelAddress modelAddress
=
dataSnapshot.child("address").getValue(ModelAddress.
class);
singleEventListener = new
ValueEventListener() {
@Override
public void
onDataChange(DataSnapshot dataSnapshot) {
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address =
addresses.get(0).getAddressLine(0);
} catch (IOException e)
{
e.printStackTrace();
}
ModelFleet fleet =
dataSnapshot.getValue(ModelFleet.class);
String address =
_address;
String customer =
task.getCustomer();
String driverName =
fleet.getFullname();
180
String departureID =
task.getDepartureID();
String workType =
task.getWorkType();
OngoinglistMap.put(key,
new ModelOngoingList(customer, address, departureID,
driverName, workType));
mAdapter.notifyDataSetChanged();
checkEmpty();
}
@Override
public void
onCancelled(DatabaseError databaseError) {
}
};
new
FireDataUserFleet().ref.child(task.getFleetID()).add
ListenerForSingleValueEvent(singleEventListener);
}
}
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
if(companyID.equals(dataSnapshot.child("companyID").
getValue().toString())){
if(dataSnapshot.child("isCompleted").getValue().toSt
ring().equals("false")){
final String key =
dataSnapshot.getKey();
final ModelTask task =
dataSnapshot.getValue(ModelTask.class);
final ModelAddress modelAddress
=
dataSnapshot.child("address").getValue(ModelAddress.
class);
singleEventListener = new
ValueEventListener() {
@Override
public void
onDataChange(DataSnapshot dataSnapshot) {
181
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address =
addresses.get(0).getAddressLine(0);
} catch (IOException e)
{
e.printStackTrace();
}
ModelFleet fleet =
dataSnapshot.getValue(ModelFleet.class);
String address =
_address;
String customer =
task.getCustomer();
String driverName =
fleet.getFullname();
String departureID =
task.getDepartureID();
String workType =
task.getWorkType();
OngoinglistMap.put(key,
new ModelOngoingList(customer, address, departureID,
driverName, workType));
mAdapter.notifyDataSetChanged();
checkEmpty();
}
@Override
public void
onCancelled(DatabaseError databaseError) {
}
};
new
FireDataUserFleet().ref.child(task.getFleetID()).add
ListenerForSingleValueEvent(singleEventListener);
}
else{
final String key =
dataSnapshot.getKey();
182
OngoinglistMap.remove(key);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
String key = dataSnapshot.getKey();
OngoinglistMap.remove(key);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.addChildEventListener(childEventL
istener);
}
Gambar 5.58 US-AM2-4: Mengambil data Task
recyclerView_ongoing.setLayoutManager(mLayoutManager
);
recyclerView_ongoing.setItemAnimator(new
DefaultItemAnimator());
recyclerView_ongoing.setAdapter(mAdapter);
checkEmpty();
recyclerView_ongoing.setVisibility(View.VISIBLE);
tv_emptyOngoingTask.setVisibility(View.GONE);
}
else {
recyclerView_ongoing.setVisibility(View.GONE);
tv_emptyOngoingTask.setVisibility(View.VISIBLE);
}
}
Gambar 5.59 US-AM2-4: set Adapter pada recycler view
184
@BindView(R.id.tv_customername) TextView
tv_customername;
@BindView(R.id.tv_address) TextView tv_address;
@BindView(R.id.tv_departureID) TextView
tv_departureID;
@BindView(R.id.tv_notfinished_type) TextView
tv_notfinished_type;
@BindView(R.id.rlCard) LinearLayout rlCard;
public TaskOngoingAdapter(Map<String,
ModelOngoingList> taskOngoingMap){
this.taskOngoingMap = taskOngoingMap;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
View itemview =
LayoutInflater.from(parent.getContext()).
inflate(R.layout.card_task_ongoing,
parent, false);
return new MyViewHolder(itemview);
}
185
@Override
public void onBindViewHolder(MyViewHolder holder,
int position) {
final List<String> keyList = new
ArrayList<>(taskOngoingMap.keySet());
final List<ModelOngoingList> taskOngoingList =
new ArrayList<>(taskOngoingMap.values());
final String key = keyList.get(position);
ModelOngoingList taskOngoing =
taskOngoingList.get(position);
String departureID;
if(taskOngoing.getDepartureID()==null){
departureID = "-";
}
else{
departureID = taskOngoing.getDepartureID();
}
holder.tv_customername.setText(taskOngoing.getCustom
er());
holder.tv_address.setText(taskOngoing.getAddress());
holder.tv_departureID.setText("Departure ID: " +
departureID);
holder.tv_notfinished_type.setText(taskOngoing.getWo
rkType());
holder.rlCard.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new
Intent(v.getContext().getApplicationContext(),
OnGoingDetail.class);
intent.putExtra("taskID", key);
v.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return taskOngoingMap.size();
}
Gambar 5.60 US-AM2-4: TaskOngoingAdapter
186
Saat salah satu card diklik, maka masuk ke activity detail task.
Aktivitas ini memiliki 2 fragment, yakni deskripsi penugasan
bernama Ongoing_Description dan riwayat rute yang dilalui
bernama Ongoing_Route. Untuk memuat produk digunakan
kode pada gambar 5.63.
187
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(getContext(),
Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
address =
addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
singleEventListener2 = new
ValueEventListener() {
@Override
public void
onDataChange(DataSnapshot dataSnapshot1) {
final ModelFleet fleet =
dataSnapshot1.getValue(ModelFleet.class);
fleetID=dataSnapshot1.getKey();
valueEventListener = new
ValueEventListener() {
@Override
public void
onDataChange(DataSnapshot dataSnapshot2) {
String departure;
if(task.getDepartureID()==null){
departure = "-";
}
else{
departure =
188
task.getDepartureID();
departureID =
task.getDepartureID();
}
tv_ongoing_drivername.setText(fleet.getFullname());
tv_ongoing_customername.setText(task.getCustomer());
tv_ongoing_address.setText(address);
tv_ongoing_departureID.setText(departure);
tv_taskType.setText(task.getWorkType());
for(DataSnapshot
postSnapshot : dataSnapshot2.getChildren()){
ModelMessage
modelmessage =
postSnapshot.getValue(ModelMessage.class);
LayoutInflater
_canvasProduct = LayoutInflater.from(getContext());
View canvasProduct =
_canvasProduct.inflate(R.layout.card_item_ongoing,
null, false);
TextView
tv_ongoing_productname = (TextView)
canvasProduct.findViewById(R.id.tv_ongoing_productna
me);
TextView
tv_ongoing_productamount = (TextView)
canvasProduct.findViewById(R.id.tv_ongoing_productam
ount);
tv_ongoing_productname.setText(modelmessage.getItem(
));
tv_ongoing_productamount.setText(modelmessage.getTar
get());
ll_ongoing_product.addView(canvasProduct);
ll_ongoing_product.requestLayout();
}
}
189
@Override
public void
onCancelled(DatabaseError databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child("message").ad
dValueEventListener(valueEventListener);
@Override
public void
onCancelled(DatabaseError databaseError) {
}
};
new
FireDataUserFleet().ref.child(task.getFleetID()).add
ListenerForSingleValueEvent(singleEventListener2);
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingl
eValueEvent(singleEventListener1);
}
Gambar 5.62 US-AM2-4: Memuat detail penugasan
mMap.clear();
customerMarker = mMap.addMarker(new
MarkerOptions().position(latLngCustomer).title(task.get
Customer()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_customer", 52, 100))));
wareHouseMarker = mMap.addMarker(new
MarkerOptions().position(latLngWareHouse).title(task.ge
tWareHouseName()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_warehouse", 52, 100))));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLn
gCustomer, 12));
if(dataSnapshot.child(FireDataTask.LOCATION).getValue()
!= null){
trackEventListener = new
ChildEventListener() {
@Override
public void
onChildAdded(DataSnapshot dataSnapshot, String s) {
ModelAddress _track =
dataSnapshot.getValue(ModelAddress.class);
LatLng track = new
LatLng(_track.getLatitude(), _track.getLongitude());
mMap.addMarker(new
MarkerOptions().position(track).
192
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_old_location", 30, 30))));
}
@Override
public void
onChildChanged(DataSnapshot dataSnapshot, String s) {
ModelAddress _track =
dataSnapshot.getValue(ModelAddress.class);
LatLng track = new
LatLng(_track.getLatitude(), _track.getLongitude());
mMap.addMarker(new
MarkerOptions().position(track).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_old_location", 30, 30))));
}
@Override
public void
onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void
onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void
onCancelled(DatabaseError databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child(FireDataTask.LOC
ATION).addChildEventListener(trackEventListener);
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingleVa
lueEvent(taskEventListener);
}
Gambar 5.64 US-AM2-4: Memuat detail kordinat lokasi
193
if(adminKey.equals(dataSnapshot.child("companyID").g
etValue().toString())){
if(!dataSnapshot.child("isCompleted").getValue().toS
tring().equals("false")){
String key =
dataSnapshot.getKey();
ModelTask task =
dataSnapshot.getValue(ModelTask.class);
ModelAddress modelAddress =
dataSnapshot.child("address").getValue(ModelAddress.
class);
String _address=null;
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address =
addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
String customer =
task.getCustomer();
String departure =
task.getDepartureID();
String address = _address;
String status =
task.getIsCompleted();
String type =
task.getWorkType();
taskFinishedMap1.put(key, new
ModelFinishedList(customer, departure, address,
status, type));
mAdapter1.notifyDataSetChanged();
196
checkEmpty();
}
if(dataSnapshot.child("isCompleted").getValue().toSt
ring().equals("unsuccessfully delivered")){
String key =
dataSnapshot.getKey();
ModelTask task =
dataSnapshot.getValue(ModelTask.class);
ModelAddress modelAddress =
dataSnapshot.child("address").getValue(ModelAddress.
class);
String _address=null;
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address =
addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
String customer =
task.getCustomer();
String departure =
task.getDepartureID();
String address = _address;
String status =
task.getIsCompleted();
String type =
task.getWorkType();
Log.d("tsss", "Finished task:
"+key);
taskFinishedMap2.put(key, new
ModelFinishedList(customer, departure, address,
status, type));
mAdapter2.notifyDataSetChanged();
checkEmpty();
}
}
}
197
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
if(adminKey.equals(dataSnapshot.child("companyID").g
etValue().toString())){
if(!dataSnapshot.child("isCompleted").getValue().toS
tring().equals("false")){
String key =
dataSnapshot.getKey();
ModelTask task =
dataSnapshot.getValue(ModelTask.class);
ModelAddress modelAddress =
dataSnapshot.child("address").getValue(ModelAddress.
class);
String _address=null;
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address =
addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
String customer =
task.getCustomer();
String departure =
task.getDepartureID();
String address = _address;
String status =
task.getIsCompleted();
String type =
task.getWorkType();
Log.d("tsss", "Finished task:
"+key);
taskFinishedMap1.put(key, new
ModelFinishedList(customer, departure, address,
status, type));
198
mAdapter1.notifyDataSetChanged();
checkEmpty();
}
else
if(!dataSnapshot.child("isCompleted").getValue().toS
tring().equals("some item not delivered")){
String key =
dataSnapshot.getKey();
ModelTask task =
dataSnapshot.getValue(ModelTask.class);
ModelAddress modelAddress =
dataSnapshot.child("address").getValue(ModelAddress.
class);
String _address=null;
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getContext(), Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address =
addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
String customer =
task.getCustomer();
String departure =
task.getDepartureID();
String address = _address;
String status =
task.getIsCompleted();
String type =
task.getWorkType();
taskFinishedMap2.put(key, new
ModelFinishedList(customer, departure, address,
status, type));
mAdapter2.notifyDataSetChanged();
checkEmpty();
}
else{
final String key =
dataSnapshot.getKey();
199
taskFinishedMap1.remove(key);
taskFinishedMap2.remove(key);
mAdapter1.notifyDataSetChanged();
mAdapter2.notifyDataSetChanged();
checkEmpty();
}
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
String key = dataSnapshot.getKey();
taskFinishedMap1.remove(key);
taskFinishedMap2.remove(key);
mAdapter1.notifyDataSetChanged();
mAdapter2.notifyDataSetChanged();
checkEmpty();
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.addChildEventListener(childEventL
istener);
}
recyclerview_finished.setLayoutManager(mLayoutManager1)
;
recyclerview_finished.setItemAnimator(new
DefaultItemAnimator());
recyclerview_finished.setAdapter(mAdapter1);
mAdapter2 = new
TaskFinishedAdapter(taskFinishedMap2);
RecyclerView.LayoutManager mLayoutManager2 = new
LinearLayoutManager(getActivity());
recyclerview_finished2.setLayoutManager(mLayoutManager2
);
recyclerview_finished2.setItemAnimator(new
DefaultItemAnimator());
recyclerview_finished2.setAdapter(mAdapter2);
checkEmpty();
}
recyclerview_finished.setVisibility(View.VISIBLE);
recyclerview_finished2.setVisibility(View.GONE);
tv_emptyFinishedTask.setVisibility(View.GONE);
}
else {
recyclerview_finished.setVisibility(View.GONE);
recyclerview_finished2.setVisibility(View.GONE);
tv_emptyFinishedTask.setVisibility(View.VISIBLE);
}
}
Gambar 5.67 US-AM2-5: Set adapter pada recyler view
201
public TaskFinishedAdapter(Map<String,
ModelFinishedList> taskFinishedMap){
this.taskFinishedMap = taskFinishedMap;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
View itemview =
LayoutInflater.from(parent.getContext()).
inflate(R.layout.card_task_finished,parent,false);
@Override
202
holder.tv_customer.setText(taskFinished.getCustomer());
holder.tv_address.setText(taskFinished.getAddress());
holder.tv_departureID.setText("departureID: " +
departureID);
holder.tv_finished_status.setText(taskFinished.getStatu
s());
holder.tv_finished_type.setText(taskFinished.getType())
;
holder.rlCard.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("tssss", "key extra: "+key );
Intent intent = new
Intent(v.getContext().getApplicationContext(),
Finished_Detail.class);
intent.putExtra("taskID", key);
v.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return taskFinishedMap.size();
}
Gambar 5.68 US-AM2-5: TaskFinishedAdapter
203
recyclerview_finished.setVisibility(View.GONE);
recyclerview_finished2.setVisibility(View.VISIBLE
);
tv_emptyFinishedTask.setVisibility(View.GONE);
}
else {
recyclerview_finished.setVisibility(View.GONE);
recyclerview_finished2.setVisibility(View.GONE);
tv_emptyFinishedTask.setVisibility(View.VISIBLE);
}
Log.d("tsss", "Finished list
checked");
}
else{
Log.d("tsss", "Finished list
unchecked");
checkEmpty();
}
}
});
}
Saat salah satu card diklik, maka masuk ke activity detail task.
Aktivitas ini memiliki 2 fragment, yakni deskripsi penugasan
bernama Finished_Description dan riwayat rute yang dilalui
206
latLngAddress = new
LatLng(custAddress.getLatitude(),
custAddress.getLongitude());
companyID = task.getCompanyID();
customer = task.getCustomer();
fleetID = task.getFleetID();
fleetName = fleet.getFullname();
wareHouseLoc = new
LatLng(wareHouseAddress.getLatitude(),
wareHouseAddress.getLongitude());
wareHouseName =
task.getWareHouseName();
207
tv_finished_address.setText(address);
tv_finished_customername.setText(customer);
tv_finished_departureID.setText(task.getDepartureID());
tv_finished_drivername.setText(fleetName);
tv_finished_status.setText(task.getIsCompleted());
tv_finished_type.setText(task.getWorkType());
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUserFleet().ref.child(task.getFleetID()).addLis
tenerForSingleValueEvent(singleEventListener2);
valueEventListener = new
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot
dataSnapshot4) {
for(DataSnapshot postSnapshot :
dataSnapshot4.getChildren()){
ModelMessage modelMessage =
postSnapshot.getValue(ModelMessage.class);
Log.d("tsss", "product load: "
+ postSnapshot.getKey()+ " " + modelMessage.getItem()+
modelMessage.getTarget());
LayoutInflater _canvasProduct =
LayoutInflater.from(getContext());
View canvasProduct =
_canvasProduct.inflate(R.layout.card_item_finished,
null, false);
TextView
tv_finished_productname = (TextView)
canvasProduct.findViewById(R.id.tv_finished_productname
);
TextView
tv_finished_producttarget = (TextView)
canvasProduct.findViewById(R.id.tv_finished_producttarg
et);
TextView
tv_finished_productactual = (TextView)
canvasProduct.findViewById(R.id.tv_finished_productactu
208
al);
tv_finished_productname.setText(modelMessage.getItem())
;
tv_finished_producttarget.setText(modelMessage.getTarge
t());
tv_finished_productactual.setText(modelMessage.getActua
l());
ll_finished_product.addView(canvasProduct);
ll_finished_product.requestLayout();
if(task.getIsCompleted().equals("unsuccessfully
delivered")){
if(Integer.parseInt(modelMessage.getActual())<Integer.p
arseInt(modelMessage.getTarget())){
String newItem =
modelMessage.getItem();
int newTarget =
Integer.parseInt(modelMessage.getTarget())-
Integer.parseInt(modelMessage.getActual());
listSize++;
Map<String, Object>
objectMessage = new HashMap<>();
objectMessage.put(FireDataTask.MESSAGE_VALUE_ITEM,
newItem);
objectMessage.put(FireDataTask.MESSAGE_VALUE_TARGET,
Integer.toString(newTarget));
messageMap.put(Integer.toString(listSize),
objectMessage);
llRework.setVisibility(View.VISIBLE);
}
else{
llRework.setVisibility(View.GONE);
}
}
}
209
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child("message").addVa
lueEventListener(valueEventListener);
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingleVa
lueEvent(singleEventListener1);
}
Gambar 5.72 US-AM2-5: Memuat detail penugasan
mMap.clear();
customerMarker = mMap.addMarker(new
MarkerOptions().position(latLngCustomer).title(task.
getCustomer()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap
("map_customer", 52, 100))));
wareHouseMarker = mMap.addMarker(new
MarkerOptions().position(latLngWareHouse).title(task
.getWareHouseName()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap
("map_warehouse", 52, 100))));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(la
tLngCustomer, 12));
if(dataSnapshot.child(FireDataTask.LOCATION).getValu
e() != null){
212
trackEventListener = new
ValueEventListener() {
@Override
public void
onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot
postSnapshot : dataSnapshot.getChildren()){
ModelAddress _track =
postSnapshot.getValue(ModelAddress.class);
LatLng track = new
LatLng(_track.getLatitude(), _track.getLongitude());
mMap.addMarker(new
MarkerOptions().position(track).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap
("map_fleet_old_location", 30, 30))));
}
}
@Override
public void
onCancelled(DatabaseError databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child(FireDataTask.
LOCATION).addValueEventListener(trackEventListener);
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingl
eValueEvent(taskEventListener);
}
Gambar 5.75 US-AM2-5: Memuat detail kordinat lokasi
213
objectMessage.put(FireDataTask.MESSAGE_VALUE_ITEM,
item);
objectMessage.put(FireDataTask.MESSAGE_VALUE_TARGET,
amount);
messageMap.put(id, objectMessage);
if(i == newMessageList.size()-1){
new
FireDataTask().writeReworkTask(companyID,
wareHouseName, latLngWareHouse, fleetID, latLngAddress,
customer, token, messageMap, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference) {
if(tasktype.equals("same fleet")){
new
FireDataTask().ReworkTaskSameFleet(oldTaskID, new
DatabaseReference.CompletionListener() {
@Override
public void
216
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference2) {
new
FireDataTempTask().ref.child(taskID).removeValue();
startActivity(new
Intent(getApplicationContext(), HomeActivity.class));
finish();
}
});
}
else if(tasktype.equals("other
fleet")){
new
FireDataTask().ReworkTaskAnotherFleet(oldTaskID, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference2) {
new
FireDataTempTask().ref.child(taskID).removeValue();
startActivity(new
Intent(getApplicationContext(), HomeActivity.class));
finish();
}
});
}
}
});
}
}
}
Gambar 5.78 US-AM4-1: Menyimpan penugasan baru di
Firebase
ModelAddress modelAdress =
dataSnapshot.child("location").getValue(ModelAddress
.class);
latLngLocation =new
LatLng(modelAdress.getLatitude(),
modelAdress.getLongitude());
reason = inbox.getReason();
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getApplicationContext(),
Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(latLngLocation.latitude,
latLngLocation.longitude,1);
location =
addresses.get(0).getAddressLine(0);
tv_location.setText(location);
} catch (IOException e) {
e.printStackTrace();
}
tv_Reason.setText(reason);
if(type.equals("task cancellation")){
taskID = inbox.getTaskID();
getTaskData();
rl_Departure.setVisibility(View.GONE);
isTask=true;
}
else if(type.equals("departure
cancellation")){
departureID =
inbox.getDepartureID();
220
getDepartureData();
rl_Task.setVisibility(View.GONE);
isTask=false;
}
if(response==null){
textView15.setVisibility(View.VISIBLE);
btn_grant.setVisibility(View.VISIBLE);
btn_decline.setVisibility(View.VISIBLE);
tv_granted.setVisibility(View.GONE);
tv_rejected.setVisibility(View.GONE);
tv_newDriver.setVisibility(View.GONE);
}
else{
textView15.setVisibility(View.GONE);
btn_grant.setVisibility(View.GONE);
btn_decline.setVisibility(View.GONE);
tv_checkDriver.setVisibility(View.GONE);
spin_driver.setVisibility(View.GONE);
btn_newDriver.setVisibility(View.GONE);
if(response.equals("accept")){
tv_granted.setVisibility(View.VISIBLE);
tv_rejected.setVisibility(View.GONE);
tv_newDriver.setText("delivery
send to " + inbox.getNewDriver());
tv_newDriver.setVisibility(View.VISIBLE);
}
if(response.equals("decline")){
tv_granted.setVisibility(View.GONE);
tv_newDriver.setVisibility(View.GONE);
tv_rejected.setVisibility(View.VISIBLE);
}
}
221
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataMessage().ref.child(HomeActivity.companyUID)
.child(fleetID).child(messageID).addListenerForSingl
eValueEvent(inboxEventListener);
}
LayoutInflater _canvasProduct =
LayoutInflater.from(getApplicationContext());
View canvasProduct =
_canvasProduct.inflate(R.layout.card_inbox_task,
null, false);
TextView tv_taskCustomer = (TextView)
canvasProduct.findViewById(R.id.tv_taskCustomer);
tv_taskCustomer.setText(customerName);
tv_taskCustomer.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new
Intent(getApplicationContext(),
OnGoingDetail.class);
intent.putExtra("taskID",
taskID);
startActivity(intent);
}
});
222
ll_task_taskList.addView(canvasProduct);
ll_task_taskList.requestLayout();
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingl
eValueEvent(taskEventListener);
}
tv_departureID.setText(modelDeparture.getuID());
tv_returnOfGood.setText(returnOfGood);
taskEventListener = new
ValueEventListener() {
@Override
public void
onDataChange(DataSnapshot dataSnapshot) {
ModelTask task =
dataSnapshot.getValue(ModelTask.class);
final String _taskID =
dataSnapshot.getKey();
String customerName =
task.getCustomer();
223
if(customer==null){
customer =
customerName;
}
else{
customer = customer
+ ", " + customerName;
}
LayoutInflater
_canvasProduct =
LayoutInflater.from(getApplicationContext());
View canvaseProduct =
_canvasProduct.inflate(R.layout.card_inbox_task,
null, false);
TextView tv_taskCustomer
= (TextView)
canvaseProduct.findViewById(R.id.tv_taskCustomer);
tv_taskCustomer.setText(customerName);
ll_departure_taskList.addView(canvaseProduct);
ll_departure_taskList.requestLayout();
tv_taskCustomer.setOnClickListener(new
View.OnClickListener() {
@Override
public void
onClick(View v) {
Intent intent =
new Intent(getApplicationContext(),
OnGoingDetail.class);
intent.putExtra("taskID", _taskID);
startActivity(intent);
}
});
@Override
public void
onCancelled(DatabaseError databaseError) {
224
}
};
new
FireDataTask().ref.child(tempTaskID).addListenerForS
ingleValueEvent(taskEventListener);
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataDeparture().ref.child(departureID).child("ta
sk").addValueEventListener(departureEventListener);
}
Gambar 5.80 US-AM4-3: Mengambil detail data pesan
new
FireDataMessage().responseAccept(HomeActivity.com
panyUID, fleetID, newDriverName, messageID,
customer, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
Toast.makeText(getApplicationContext(),
newDriverName + " selected", Toast.LENGTH_SHORT);
ll_task_taskList.removeAllViews();
getInboxData();
}
});
}
});
}
else if(isTask==false){
for(int i=0; i<taskList.size();i++){
final String tempTask =
taskList.get(i);
new
FireDataTask().changeDriver(tempTask,
newDriverID, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
getInboxData();
228
}
});
if(i==taskList.size()-1){
new
FireDataUserFleet().writeUserStopWorking(fleetID,
new DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
new
FireDataUserFleet().ref.child(fleetID).child("dep
artureID").removeValue();
new
FireDataDeparture().ref.child(departureID).remove
Value();
new
FireDataMessage().responseAccept(HomeActivity.com
panyUID, fleetID, newDriverName, messageID,
customer, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
new
FireDataTask().ref.child(tempTask).child("departu
reID").removeValue();
getInboxData();
}
});
}
});
}
}
}
}
if(allDataList.size()==0){
btn_edit.setVisibility(View.GONE);
}
else{
btn_edit.setVisibility(View.VISIBLE);
}
}
Gambar 5.86 US-AM5-1L: Tampilan default manajemen
gudang
if(_modelWarehouse.getCompanyID().equals(user.getUid())
){
ModelAddress modelAddress =
dataSnapshot.child(FireDataWareHouse.ADDRESS).getValue(
ModelAddress.class);
LatLng latLng = new
LatLng(modelAddress.getLatitude(),
modelAddress.getLongitude());
ModelWarehouse modelWarehouse = new
ModelWarehouse(dataSnapshot.getKey(),
_modelWarehouse.getName(), latLng);
allDataList.add(modelWarehouse);
nameList.add(modelWarehouse.getName());
ArrayAdapter<String> dataAdapter =
new ArrayAdapter<>(getApplicationContext(),
android.R.layout.simple_spinner_dropdown_item,
nameList);
dataAdapter.setDropDownViewResource(android.R.layout.si
mple_spinner_dropdown_item);
spin_wareHouse.setAdapter(dataAdapter);
if(allDataList.size()==0){
btn_edit.setVisibility(View.GONE);
}
else{
btn_edit.setVisibility(View.VISIBLE);
}
}
}
}
@Override
public void onChildChanged(DataSnapshot
232
dataSnapshot, String s) {
ModelWarehouse _modelWarehouse =
dataSnapshot.getValue(ModelWarehouse.class);
if(_modelWarehouse != null){
if(_modelWarehouse.getCompanyID().equals(user.getUid())
){
ModelAddress modelAddress =
dataSnapshot.child("address").getValue(ModelAddress.cla
ss);
LatLng latLng = new
LatLng(modelAddress.getLatitude(),
modelAddress.getLongitude());
ModelWarehouse modelWarehouse = new
ModelWarehouse(dataSnapshot.getKey(),
_modelWarehouse.getName(), latLng);
allDataList.remove(wareHouseData);
nameList.remove(wareHouseName);
allDataList.add(modelWarehouse);
nameList.add(modelWarehouse.getName());
ArrayAdapter<String> dataAdapter =
new ArrayAdapter<>(getApplicationContext(),
android.R.layout.simple_spinner_dropdown_item,
nameList);
dataAdapter.setDropDownViewResource(android.R.layout.si
mple_spinner_dropdown_item);
spin_wareHouse.setAdapter(dataAdapter);
if(allDataList.size()==0){
btn_edit.setVisibility(View.GONE);
}
else{
btn_edit.setVisibility(View.VISIBLE);
}
}
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
ModelWarehouse modelWarehouse =
dataSnapshot.getValue(ModelWarehouse.class);
233
if(modelWarehouse != null){
if(modelWarehouse.getCompanyID().equals(user.getUid()))
{
allDataList.remove(modelWarehouse);
nameList.remove(modelWarehouse.getName());
ArrayAdapter<String> dataAdapter =
new ArrayAdapter<>(getApplicationContext(),
android.R.layout.simple_spinner_dropdown_item,
nameList);
dataAdapter.setDropDownViewResource(android.R.layout.si
mple_spinner_dropdown_item);
spin_wareHouse.setAdapter(dataAdapter);
if(allDataList.size()==0){
btn_edit.setVisibility(View.GONE);
}
else{
btn_edit.setVisibility(View.VISIBLE);
}
}
}
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataWareHouse().ref.addChildEventListener(wareHouse
EventListener);
spin_wareHouse.setOnItemSelectedListener(this);
}
Gambar 5.88 US-AM5-1: Mengambil data gudang
234
if(wareHouseMarker != null){
wareHouseMarker.remove();
}
wareHouseMarker = mMap.addMarker(new
MarkerOptions().position(centerFromPoint).title(
wareHouseName).
icon(BitmapDescriptorFactory.fromBitmap(resizeBi
tmap("map_warehouse", 59, 100))));
Log.d("tsss","center from point: " +
centerFromPoint.toString());
newAddress = new
LatLng(centerFromPoint.latitude,
centerFromPoint.longitude);
}
Gambar 5.89 US-AM5-1: Mengambil kordinat peta
235
Toast.makeText(getApplicationContext(),"new
warehouse successfully added",
Toast.LENGTH_SHORT).show();
}
else{
Log.d("Tsss", "error
creating new warehouse: " +
databaseError.getDetails());
}
}
});
}
}
Gambar 5.90 US-AM5-1: Menambah gudang baru
236
3. Menghapus gudang
Jika ingin menghapus gudang, user tinggal menekan
tombol btn_delete dan aplikasi akan menghapus gudang
sesuai dengan posisi yang terpilih di spinner kemudian
menampilkan Actvitas ini pada tampilan default seperti
gambar 5.87.. Kode yang digunakan adalah pada gambar
5.91.
@OnClick(R.id.btn_delete) public void
deleteWareHouse(){
new
FireDataWareHouse().ref.child(wareHouseID).removeVa
lue();
setDefaultView();
}
Gambar 5.91 US-AM5-1: Menghapus gudang
237
new
FireDataWareHouse().writeAll(wareHouseID,
user.getUid(), newName, newAddress, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError==null){
setDefaultView();
newAddress=null;
}
else{
Log.d("Tsss", "error saving
edit name and address: " +
databaseError.getDetails());
}
}
});
}
}
Gambar 5.92 US-AM5-1: Memperbaharui gudang
mAuth.sendPasswordResetEmail(email).addOnCompleteListen
er(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void>
task) {
Toast.makeText(getApplicationContext(),
"Check your email", Toast.LENGTH_SHORT).show();
}
});
}
}
Gambar 5.96 US-AM6-1: Reset password
Virtual Machine
Nama perangkat Nexus 5
Processor Multi-Core 4 CPUs
Memory 1536 MB
Sistem Operasi Android API 24 x86 Nougat
242
@Override
public void onCancelled(DatabaseError databaseError)
{
}
};
new
FireDataUser().ref.addValueEventListener(emailEventListener)
;
}
try{
mAuth.signInWithEmailAndPassword(email,
password).addOnCompleteListener(this, new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
token =
FirebaseInstanceId.getInstance().getToken();
new FireDataUser().writeUserPassword(uID,
password, new DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference) {
startActivity(new
Intent(SignInActivity.this, HomeActivity.class));
finish();
}
});
}
else{
Toast.makeText(getApplicationContext(),
"Password incorrect", Toast.LENGTH_SHORT).show();
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(getApplicationContext(),
e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
catch(Throwable t) {
t.printStackTrace();
AlertDialog alertDialog = new
AlertDialog.Builder(this).create();
alertDialog.setTitle("Error");
alertDialog.setMessage("Application running on Android 4.4
and above");
alertDialog.setButton(AlertDialog.BUTTON_NEUTRAL, "OK",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int
which) {
dialog.dismiss();
}
});
alertDialog.show();
return;
}
Gambar 5.101 US-AS1-1: Sign in
247
tmpPassword = fleetList.get(i).getPassword();
if(tmpPassword.equals(password)){
companyID = fleetList.get(i).getCompanyID();
fullname =fleetList.get(i).getFullname();
license = fleetList.get(i).getLicense();
phoneNumber = fleetList.get(i).getPhone();
address = new LatLng(fleetList.get(i).getLat(),
fleetList.get(i).getLang());
gender = fleetList.get(i).getGender();
birthDate = fleetList.get(i).getBirthdate();
truckName = fleetList.get(i).getTruckName();
truckPlate = fleetList.get(i).getTruckPlate();
try{
mAuth.createUserWithEmailAndPassword(email,password).addOn
CompleteListener(this, new
OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull
Task<AuthResult> task) {
if(task.isSuccessful()){
Toast.makeText(SignInActivity.this,
"Account Registered successfully",
Toast.LENGTH_SHORT).show();
new
FireDataUser().writeUser(mAuth.getCurrentUser().getUid(),
companyID, fullname, email, password, license,
phoneNumber,
address, gender, birthDate,
truckName, truckPlate, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError, DatabaseReference
databaseReference) {
if(databaseError ==
null){
//delete old file
user
new
FireDataUser().writeUserToken(FirebaseAuth.getInstance().g
etUid(), token, new DatabaseReference.CompletionListener()
{
@Override
public void
onComplete(DatabaseError databaseError, DatabaseReference
databaseReference) {
startActivity(new Intent(SignInActivity.this,
248
HomeActivity.class));
finish();
new
FireDataUser().ref.child(uID).removeValue();
}
});
}
else{
if(fleetID.equals(dataSnapshot.child("fleetID").getValu
e().toString())){
if(dataSnapshot.child("isCompleted").getValue().toStrin
g().equals("false")){
final String key =
dataSnapshot.getKey();
final ModelTask task =
dataSnapshot.getValue(ModelTask.class);
final ModelAddress address =
dataSnapshot.child("address").getValue(ModelAddress.cla
ss);
taskMap.put(key, task);
addressMap.put(key, address);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
}
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
if(fleetID.equals(dataSnapshot.child("fleetID").getValu
e().toString())){
if(dataSnapshot.child("isCompleted").getValue().toStrin
g().equals("false")){
final String key =
dataSnapshot.getKey();
final ModelTask task =
dataSnapshot.getValue(ModelTask.class);
final ModelAddress address =
dataSnapshot.child("address").getValue(ModelAddress.cla
ss);
taskMap.put(key, task);
addressMap.put(key, address);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
}
else
if(!fleetID.equals(dataSnapshot.child("fleetID").getVal
ue().toString())){
251
if(dataSnapshot.child("isCompleted").getValue().toStrin
g().equals("false")){
final String key =
dataSnapshot.getKey();
taskMap.remove(key);
addressMap.remove(key);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
String key = dataSnapshot.getKey();
taskMap.remove(key);
addressMap.remove(key);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.addChildEventListener(taskEventListe
ner);
}
Gambar 5.103 US-AS1-2: Mengambil data task
recyclerview_notfinished.setLayoutManager(mLayoutManage
r);
recyclerview_notfinished.setItemAnimator(new
DefaultItemAnimator());
recyclerview_notfinished.setAdapter(mAdapter);
checkEmpty();
}
recyclerview_notfinished.setVisibility(View.VISIBLE);
tv_emptyNotFinishedTask.setVisibility(View.GONE);
}
else {
recyclerview_notfinished.setVisibility(View.GONE);
tv_emptyNotFinishedTask.setVisibility(View.VISIBLE);
}
}
Gambar 5.104 US-AS1-2: Set adapter pada recycler view
@BindView(R.id.tv_notfinished_customer) TextView
notfinished_customer;
@BindView(R.id.tv_notfinished_address) TextView
notfinished_address;
@BindView(R.id.tv_notfinished_type) TextView
tv_notfinished_type;
@BindView(R.id.cb_SelectTask) CheckBox
cb_SelectTask;
@BindView(R.id.rlCard) RelativeLayout rlCard;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
View itemView=
LayoutInflater.from(parent.getContext())
254
.inflate(R.layout.card_not_finish_task,parent,false);
@Override
public void onBindViewHolder(MyViewHolder holder, int
position) {
final List<String> keyList = new
ArrayList<>(taskMap.keySet());
final List<ModelTask> taskList = new
ArrayList<>(taskMap.values());
final List<ModelAddress> addressList = new
ArrayList<>(addressMap.values());
final String key = keyList.get(position);
final ModelTask task = taskList.get(position);
final ModelAddress modelAddress =
addressList.get(position);
String _address=null;
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(activity.getApplicationContext(),
Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address = addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
holder.notfinished_customer.setText(task.getCustomer())
;
holder.notfinished_address.setText(_address);
holder.tv_notfinished_type.setText(task.getWorkType());
holder.cb_SelectTask.setOnCheckedChangeListener(new
CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton
buttonView, boolean isChecked) {
if(isChecked){
departureMap.put(key, task);
Log.d("tsss", "selected :"+ key);
}
else{
255
departureMap.remove(key);
Log.d("tsss", "removed :"+key);
}
}
});
holder.rlCard.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new
Intent(v.getContext().getApplicationContext(),
NotFinished_Task_Detail.class);
intent.putExtra("taskID", key);
v.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return taskMap.size();
}
Geocoder geocoder;
List<Address> addresses1;
List<Address> addresses2;
geocoder = new
Geocoder(getApplicationContext(), Locale.getDefault());
try {
addresses1 =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
addresses2 =
geocoder.getFromLocation(modelWareHouse.getLatitude(),
modelWareHouse.getLongitude(),1);
addressCustomer =
addresses1.get(0).getAddressLine(0);
addressWareHouse =
addresses2.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
valueEventListener = new
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot
dataSnapshot) {
tv_notfinished_address.setText(addressCustomer);
tv_notfinished_customer.setText(modelTask.getCustomer()
);
tv_taskType.setText(modelTask.getWorkType());
tv_wareHouseName.setText((modelTask.getWareHouseName())
);
tv_wareHouseAddress.setText(addressWareHouse);
258
for(DataSnapshot postSnapshot :
dataSnapshot.getChildren()){
final ModelMessage modelMessage
= postSnapshot.getValue(ModelMessage.class);
Log.d("tsss","message: "+
modelMessage.getItem());
LayoutInflater _canvasProduct =
LayoutInflater.from(getApplicationContext());
View canvasProduct =
_canvasProduct.inflate(R.layout.card_item_not_finished,
null, false);
TextView
tv_notfinished_productname = (TextView)
canvasProduct.findViewById(R.id.tv_notfinished_productn
ame);
TextView
tv_notfinished_productamount = (TextView)
canvasProduct.findViewById(R.id.tv_notfinished_producta
mount);
tv_notfinished_productname.setText(modelMessage.getItem
());
tv_notfinished_productamount.setText(modelMessage.getTa
rget());
rl_product.addView(canvasProduct);
rl_product.requestLayout();
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child("message").addVa
lueEventListener(valueEventListener);
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingleVa
259
lueEvent(singleEventListener);
}
Gambar 5.107 US-AS1-2: Memuat detail penugasan
objectMap.put(FireDataDeparture.TASKCOMPLETED, false);
departureMap.put(task, objectMap);
if(i == key.size()-1){
new
FireDataDeparture().writeDeparture(HomeActivity.company
ID, fleetID, departureMap, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
final String departureID =
databaseReference.getKey();
new
FireDataUser().writeUserStartWorking(fleetID,
departureID,new DatabaseReference.CompletionListener()
{
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError==null){
for(int j=0;
j<key.size(); j++){
String _task =
key.get(j);
new
FireDataTask().writeTaskDeparture(_task, departureID,
new DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
261
// Go
to Job Intent, that could not interrupt
Intent
intent = new Intent(getContext(), TaskOngoing.class);
intent.putExtra("departureID", departureID);
startActivity(intent);
}
});
}
}
}
});
}
});
}
}
}
else{
Toast.makeText(getContext(), "Select at
least 1 task to deliver", Toast.LENGTH_SHORT).show();
}
}
Gambar 5.109 US-AS1-2: Mulai melakukan pengantaran
}
Gambar 5.112 US-AM1-3: Mengirimkan pesan ajuan
pengalihan tugas
264
if(fleetID.equals(dataSnapshot.child("fleetID").getV
alue().toString())){
if(!dataSnapshot.child("isCompleted").getValue().toS
tring().equals("false")){
final String key =
dataSnapshot.getKey();
final ModelTask task =
dataSnapshot.getValue(ModelTask.class);
final ModelAddress address =
dataSnapshot.child("address").getValue(ModelAddress.
class);
taskMap.put(key, task);
addressMap.put(key, address);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
}
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
if(fleetID.equals(dataSnapshot.child("fleetID").getV
alue().toString())){
if(dataSnapshot.child("isCompleted").getValue().toSt
ring().equals("true")){
final String key =
dataSnapshot.getKey();
final ModelTask task =
dataSnapshot.getValue(ModelTask.class);
final ModelAddress address =
dataSnapshot.child("address").getValue(ModelAddress.
class);
taskMap.put(key, task);
addressMap.put(key, address);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
}
266
else
if(!fleetID.equals(dataSnapshot.child("fleetID").get
Value().toString())){
if(dataSnapshot.child("isCompleted").getValue().toSt
ring().equals("true")){
final String key =
dataSnapshot.getKey();
taskMap.remove(key);
addressMap.remove(key);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
String key = dataSnapshot.getKey();
taskMap.remove(key);
addressMap.remove(key);
mAdapter.notifyDataSetChanged();
checkEmpty();
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.addChildEventListener(childEventL
istener);
}
Gambar 5.113 US-AS1-3: Mengambil data task
267
recyclerview_finished.setLayoutManager(mLayoutMan
ager);
recyclerview_finished.setItemAnimator(new
DefaultItemAnimator());
recyclerview_finished.setAdapter(mAdapter);
checkEmpty();
}
recyclerview_finished.setVisibility(View.VISIBLE)
;
tv_emptyFinishedTask.setVisibility(View.GONE);
}
else {
recyclerview_finished.setVisibility(View.GONE);
tv_emptyFinishedTask.setVisibility(View.VISIBLE);
}
}
Gambar 5.114 US-AS1-3: Set adapter recycler view
268
@BindView(R.id.tv_finished_customer) TextView
tv_finished_customer;
@BindView(R.id.tv_finished_departureID) TextView
tv_finished_departureID;
@BindView(R.id.tv_finished_address) TextView
tv_finished_address;
@BindView(R.id.tv_notfinished_type) TextView
tv_notfinished_type;
@BindView(R.id.tv_notfinished_isCompleted) TextView
tv_notfinished_isCompleted;
@BindView(R.id.rlCard) RelativeLayout rlCard;
@Override
public MyViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
View itemview =
LayoutInflater.from(parent.getContext()).
269
inflate(R.layout.card_finish_task,parent,false);
@Override
public void onBindViewHolder(MyViewHolder holder, int
position) {
final List<String> keyList = new
ArrayList<>(productMap.keySet());
final List<ModelTask> taskList = new
ArrayList<>(productMap.values());
final List<ModelAddress> addressList = new
ArrayList<>(addressMap.values());
final String key = keyList.get(position);
final ModelTask task = taskList.get(position);
final ModelAddress modelAddress =
addressList.get(position);
String _address=null;
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(activity.getApplicationContext(),
Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(modelAddress.getLatitude(),
modelAddress.getLongitude(),1);
_address = addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace();
}
holder.tv_finished_customer.setText(task.getCustomer())
;
holder.tv_finished_departureID.setText("Departure
ID: " + task.getDepartureID());
holder.tv_finished_address.setText(_address);
holder.tv_notfinished_type.setText(task.getWorkType());
holder.tv_notfinished_isCompleted.setText(task.isComple
ted());
holder.rlCard.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new
270
Intent(v.getContext().getApplicationContext(),
Finished_Task_Detail.class);
intent.putExtra("taskID", key);
v.getContext().startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return productMap.size();
}
Gambar 5.115 US-ASI-3: FinishedTaskAdapter
tv_finished_customer.setText(task.getCustomer());
tv_finished_address.setText(addressCustomer);
tv_ongoing_departureID.setText(task.getDepartureID());
tv_taskType.setText(task.getWorkType());
tv_completionStatus.setText(task.isCompleted());
tv_wareHouseName.setText(task.getWareHouseName());
272
tv_wareHouseAddress.setText(addressWareHouse);
for(DataSnapshot postSnapshot :
dataSnapshot.getChildren()){
ModelMessage message =
postSnapshot.getValue(ModelMessage.class);
LayoutInflater _canvasProduct =
LayoutInflater.from(getContext());
View canvasProduct =
_canvasProduct.inflate(R.layout.card_item_finished,
null, false);
TextView
tv_finished_productname = (TextView)
canvasProduct.findViewById(R.id.tv_finished_productname
);
TextView
tv_finished_producttarget = (TextView)
canvasProduct.findViewById(R.id.tv_finished_producttarg
et);
TextView
tv_finished_productactual = (TextView)
canvasProduct.findViewById(R.id.tv_finished_productactu
al);
tv_finished_productname.setText(message.getItem());
tv_finished_producttarget.setText(message.getTarget());
tv_finished_productactual.setText(message.getActual());
rl_finished_product.addView(canvasProduct);
rl_finished_product.requestLayout();
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child("message").addVa
lueEventListener(valueEventListener);
}
@Override
public void onCancelled(DatabaseError
databaseError) {
273
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingleVa
lueEvent(singleEventListener);
}
mMap.clear();
customerMarker = mMap.addMarker(new
MarkerOptions().position(latLngCustomer).title(ta
sk.getCustomer()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBit
map("map_customer", 52, 100))));
wareHouseMarker = mMap.addMarker(new
MarkerOptions().position(latLngWareHouse).title(t
ask.getWareHouseName()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBit
map("map_warehouse", 52, 100))));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom
(latLngCustomer, 12));
if(dataSnapshot.child(FireDataTask.LOCATION).getV
alue() != null){
275
trackEventListener = new
ValueEventListener() {
@Override
public void
onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot
postSnapshot : dataSnapshot.getChildren()){
ModelAddress _track =
postSnapshot.getValue(ModelAddress.class);
LatLng track = new
LatLng(_track.getLatitude(),
_track.getLongitude());
mMap.addMarker(new
MarkerOptions().position(track).
icon(BitmapDescriptorFactory.fromBitmap(resizeBit
map("map_fleet_old_location", 30, 30))));
}
}
@Override
public void
onCancelled(DatabaseError databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child(FireDataTa
sk.LOCATION).addValueEventListener(trackEventList
ener);
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).addListenerForSi
ngleValueEvent(taskEventListener);
}
Gambar 5.119 US-AS1-3: Memuat detail kordinat lokasi
276
if(fleetMarker != null)
fleetMarker.remove();
fleetMarker = mMap.addMarker(new
MarkerOptions().position(fleetLatLng).title("Flee
t")
.icon(BitmapDescriptorFactory.fromBitmap(resizeBi
tmap("map_fleet_current_location", 42, 80))));
mMap.moveCamera(CameraUpdateFactory.newLatLng(fle
etLatLng));
if(taskID != null){
if(fleetLatLng!=null){
new
FireDataTask().writeTaskLocation(taskID,
fleetLatLng, new
DatabaseReference.CompletionListener() {
@Override
public void
280
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
}
});
}
}
}
@Override
public void onStatusChanged(String
provider, int status, Bundle extras) {
@Override
public void onProviderEnabled(String
provider) {
@Override
public void onProviderDisabled(String
provider) {
}
};
LocationManager mLocationManager =
(LocationManager)
getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED
&&
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED) {
mLocationManager.requestLocationUpdates(LocationM
anager.GPS_PROVIDER, 2000,20, mLocationListener);
}
}
Gambar 5.123 US-AS3-1: Mengambil lokasi terkini
281
mMap.addMarker(new
MarkerOptions().position(track).
icon(BitmapDescriptorFactory.fromBitmap(resizeBit
map("map_fleet_old_location", 25, 25))));
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child(FireDataTa
282
sk.LOCATION).addValueEventListener(trackEventList
ener);
}
Gambar 5.124 US-AS3-1: Mengambil lokasi tersimpan dari
Firebase
Geocoder geocoder;
List<Address> addresses;
geocoder = new
Geocoder(getApplicationContext(), Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(latitude, longitude,1);
address =
addresses.get(0).getAddressLine(0);
} catch (IOException e) {
e.printStackTrace(); }
messageEventListener = new
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot
dataSnapshot) {
token = task.getToken();
tv_completion_customer.setText(task.getCustomer());
tv_completion_address.setText(address);
for(DataSnapshot postSnapshot :
dataSnapshot.getChildren()){
//Load Product From Database
final ModelMessage modelMessage
= postSnapshot.getValue(ModelMessage.class);
LayoutInflater _canvasProduct =
LayoutInflater.from(getApplicationContext());
View canvasProduct =
284
_canvasProduct.inflate(R.layout.card_item_arrives,
null, false);
TextView
tv_completion_productname = (TextView)
canvasProduct.findViewById(R.id.tv_completion_productna
me);
TextView
tv_completion_producttarget = (TextView)
canvasProduct.findViewById(R.id.tv_completion_productta
rget);;
EditText
et_completion_productName = (EditText)
canvasProduct.findViewById(R.id.et_completion_productam
ount);
tv_completion_productname.setText(modelMessage.getItem(
));
tv_completion_producttarget.setText(modelMessage.getTar
get());
rl_completion_product.addView(canvasProduct);
rl_completion_product.requestLayout();
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataTask().ref.child(taskID).child("message").addVa
lueEventListener(messageEventListener);
}
@Override
public void onCancelled(DatabaseError
databaseError) {
285
}
};
new
FireDataTask().ref.child(taskID).addListenerForSingleVa
lueEvent(taskEventListener);
}
Gambar 5.126 US-AS3-2: Mengambil detail data task dari
Firebase
public void fleetPerform(){
fleetEventListener = new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot
dataSnapshot) {
countSuccess =
dataSnapshot.child(FireDataUser.COUNT_SUCCESS).ge
tValue(Integer.class);
countFailed =
dataSnapshot.child(FireDataUser.COUNT_FAILED).get
Value(Integer.class);
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataUser().ref.child(fleetID).addListenerForS
ingleValueEvent(fleetEventListener);
}
Gambar 5.127 US-AS3-2: Mengambil data kinerja user
new
FireDataDeparture().writeCompletedDelivery(depart
ureID, taskID, completeMessage, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
checkDepartureComplete();
}
});
}
});
}
if(et_token.getText().toString().equals(token)){
for(int i = 0; i< productList.size();
i++){
String id =
productList.get(i).getId() + "";
String item =
productList.get(i).getTvItem().getText() + "";
String target =
productList.get(i).getTvTarget().getText() + "";
String actual =
productList.get(i).getEtActual().getText() + "";
if(Integer.parseInt(actual)<Integer.parseInt(targ
et)){
completeMessage = "unsuccessfully
delivered";
}
288
objectMap.put(FireDataTask.MESSAGE_VALUE_ITEM,
item);
objectMap.put(FireDataTask.MESSAGE_VALUE_TARGET,
target);
objectMap.put(FireDataTask.MESSAGE_VALUE_ACTUAL,
actual);
productMap.put(id, objectMap);
if(i == productList.size()-1){
if(completeMessage.equals("unsuccessfully
delivered")){
countFailed++;
new
FireDataUser().writeUserCountFailed(fleetID,
countFailed, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
sendCompletion();
}
});
}
else
if(completeMessage.equals("successfully
completed")){
countSuccess++;
new
FireDataUser().writeUserCountSuccess(fleetID,
countSuccess, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
sendCompletion();
}
});
289
}
}
}
}
else{
Toast.makeText(CompletionActivity.this,
"token incorrect", Toast.LENGTH_SHORT).show();
return;
}
}
Gambar 5.129 US-AS3-2: Mengirim data penyelesaian tugas
ke Firebase
Toast.makeText(getApplicationContext(), "Your
request will be considered",
Toast.LENGTH_LONG).show();
finish();
}
});
}
}
Gambar 5.132 US-AS3-3: Mengirimkan pesan ajuan
pengalihan
292
messageAdapter.notifyDataSetChanged();
checkEmpty();
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataCompany().ref.child(HomeActivity.companyID).add
ListenerForSingleValueEvent(companyEventListener);
}
@Override
public void onChildChanged(final DataSnapshot
dataSnapshot1, String s) {
final ModelInbox _message =
dataSnapshot1.getValue(ModelInbox.class);
final String key = dataSnapshot1.getKey();
companyEventListener = new
294
ValueEventListener() {
@Override
public void onDataChange(DataSnapshot
dataSnapshot) {
String companyName =
dataSnapshot.child("fullname").getValue().toString();
String type = _message.getType();
final String response =
_message.getResponse();
final String customer =
_message.getCustomer();
if(response != null){
boolean isRead =
dataSnapshot1.child(FireDataMessage.IS_READ).getValue(B
oolean.class);
Bitmap profil = null;
messageMap.put(key, new
ModelInbox(HomeActivity.companyID, companyName, profil,
type, customer, response, isRead));
messageAdapter.notifyDataSetChanged();
checkEmpty();
}
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataCompany().ref.child(HomeActivity.companyID).add
ListenerForSingleValueEvent(companyEventListener);
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
String key = dataSnapshot.getKey();
messageMap.remove(key);
messageAdapter.notifyDataSetChanged();
checkEmpty();
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
295
}
};
new
FireDataMessage().ref.child(HomeActivity.companyID).chi
ld(HomeActivity.fleetUID).addChildEventListener(inboxEv
entListener);
}
Gambar 5.133 US-AS3-4: Mengambil data message dari
Firebase
recyclerview_message.setLayoutManager(layoutManager)
;
recyclerview_message.setItemAnimator(new
DefaultItemAnimator());
recyclerview_message.setAdapter(messageAdapter);
checkEmpty();
}
recyclerview_message.setVisibility(View.VISIBLE);
tv_emptyMessage.setVisibility(View.GONE);
}
else {
recyclerview_message.setVisibility(View.GONE);
tv_emptyMessage.setVisibility(View.VISIBLE);
}
}
Gambar 5.134 US-AS3-3: set Adapter pada recycler view
296
@Override
public MyViewHolder onCreateViewHolder(ViewGroup
parent, int viewType) {
View itemview =
LayoutInflater.from(parent.getContext()).
inflate(R.layout.card_message, parent,
false);
return new MessageAdapter.MyViewHolder(itemview);
}
@Override
public void onBindViewHolder(final MyViewHolder holder,
int position) {
final List<String> keySet = new
ArrayList<>(messageMap.keySet());
final List<ModelInbox> inboxList = new
ArrayList<>(messageMap.values());
final String key = keySet.get(position);
final ModelInbox modelInbox =
inboxList.get(position);
boolean isRead = modelInbox.isRead();
if(isRead==true){
holder.iv_new.setVisibility(View.GONE);
holder.btn_IUnderstand.setVisibility(View.GONE);
}
else{
297
holder.iv_new.setVisibility(View.VISIBLE);
holder.btn_IUnderstand.setVisibility(View.VISIBLE);
}
holder.tv_content.setText(Html.fromHtml(content));
}
else if(response.equals("decline")){
String _content="Your request delivering to "+
modelInbox.getCustomer() + " was rejected. You must
finish the delivery";
String content = "<font
color='#FF0000'>"+_content+"</font>";
holder.tv_content.setText(Html.fromHtml(content));
}
else if(response.equals("abort")){
String _content="Abort your delivery to " +
modelInbox.getCustomer() + ". The transaction has been
canceled.";
String content = "<font
color='#5899e2'>"+_content+"</font>";
holder.tv_content.setText(Html.fromHtml(content));
}
holder.tv_sender.setText(modelInbox.getCompanyName());
holder.tv_type.setText(modelInbox.getType());
holder.iv_profil.setImageBitmap(modelInbox.getProfilPic
ture());
holder.btn_IUnderstand.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v) {
new
FireDataMessage().setAsRead(HomeActivity.companyID,
HomeActivity.fleetUID, key, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference) {
298
holder.iv_new.setVisibility(View.GONE);
holder.btn_IUnderstand.setVisibility(View.GONE);
}
});
}
});
}
@Override
public int getItemCount() {
return messageMap.size();
}
Gambar 5.135 US=AS3-3: messageAdapter
if(dataSnapshot.getKey().equals(HomeActivity.fleetU
ID)){
if(dataSnapshot.child(FireDataUser.WORKING).getValu
e().toString().equals("false")){
startActivity(new
Intent(getApplicationContext(),
HomeActivity.class));
finish();
}
}
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
if(dataSnapshot.getKey().equals(HomeActivity.fleetU
ID)){
if(dataSnapshot.child(FireDataUser.WORKING).getValu
e().toString().equals("false")){
startActivity(new
Intent(getApplicationContext(),
HomeActivity.class)); finish();
}
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) { }
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) { }
@Override
public void onCancelled(DatabaseError
databaseError) { }
};
new
FireDataUser().ref.addChildEventListener(workEventL
istener);
Gambar 5.137 US-AS3-3: Cek apakah sopir bekerja
301
loadtask();
idlingView();
}
}
});
}
if(dataSnapshot.getKey().toString().equals(de
partureID)){
if(taskID != null){
if(dataSnapshot.child("task").child(taskID).g
etValue() == null){
cancel();
}
}
}
checkDepartureComplete();
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
302
if(dataSnapshot.getKey().toString().equals(de
partureID)){
if(taskID != null){
if(dataSnapshot.child("task").child(taskID).g
etValue() == null){
cancel();
}
}
}
checkDepartureComplete();
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) {
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataDeparture().ref.addChildEventListener
(abortEventListener);
if(dataSnapshot.getValue()==null){
new
FireDataDeparture().writeCompletedDeparture(d
epartureID, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
new
FireDataUser().writeUserStopWorking(HomeActiv
ity.fleetUID, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
new
FireDataUser().ref.child(HomeActivity.fleetUI
D).child(FireDataUser.DEPARTUREID).removeValu
e();
startActivity(new
Intent(getApplicationContext(),
HomeActivity.class));
finish();
}
});
}
});
}
else{
String isTaskComplete=null;
for(DataSnapshot postSnapshot
: dataSnapshot.getChildren()){
isTaskComplete =
postSnapshot.child("isTaskCompleted").getValu
e().toString();
Log.d("tsss", "task
304
if(isTaskComplete.equals("false")){
break;
}
}
new
FireDataUser().writeUserStopWorking(HomeActiv
ity.fleetUID, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
new
FireDataUser().ref.child(HomeActivity.fleetUI
D).child(FireDataUser.DEPARTUREID).removeValu
e();
startActivity(new
Intent(getApplicationContext(),
HomeActivity.class));
finish();
}
});
}
});
}
}
}
@Override
305
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_current_location", 59, 100))));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(fleet
Loc, 17));
}
});
}
}
Gambar 5.140 US-AS4-1: memusatkan kembali lokasi pada
peta
307
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap("m
ap_fleet_current_location", 59, 100))));
}
}
});
}
@Override
public void onStatusChanged(String provider, int
status, Bundle extras) { }
@Override
public void onProviderEnabled(String provider) { }
@Override
public void onProviderDisabled(String provider) { }
};
mLocationManager.requestLocationUpdates(LocationManager
.GPS_PROVIDER, 2000,20, mLocationListener);
}
Gambar 5.141 US-AS4-1: HomeActivity LocationListener
308
}
});
@Override
public void onStatusChanged(String provider,
int status, Bundle extras) { }
@Override
public void onProviderEnabled(String provider)
{ }
@Override
public void onProviderDisabled(String provider)
{ }
};
LocationManager mLocationManager =
(LocationManager) getSystemService(LOCATION_SERVICE);
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) ==
PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) ==
PackageManager.PERMISSION_GRANTED) {
mLocationManager.requestLocationUpdates(LocationManager
.GPS_PROVIDER, 2000,20, mLocationListener);
}
}
Gambar 5.142 US-AS4-1: TaskOngoing LocationListener
309
ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) {
return;
}
Location location =
LocationServices.FusedLocationApi.getLastLocation
(googleApiClient);
if(location != null){
fleetLoc = new
LatLng(location.getLatitude(),
location.getLongitude());
new
FireDataUser().writeUserLocation(fleetUID,
fleetLoc, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference
databaseReference) {
Log.d("tsss", "Location Update:
"+fleetLoc);
if (fleetMarker != null){
fleetMarker.remove();
}
fleetMarker = mMap.addMarker(new
MarkerOptions().position(fleetLoc).title("Fleet")
.
icon(BitmapDescriptorFactory.fromBitmap(resizeBit
map("map_fleet_current_location", 59, 100))));
mMap.moveCamera(CameraUpdateFactory.newLatLngZoom
(fleetLoc, 17));
}
});
}
}
if(companyID.equals(modelWarehouse.getCompanyID())){
ModelAddress addressWareHouse =
dataSnapshot.child("address").getValue(ModelAddress.
class);
LatLng _temp = new
LatLng(addressWareHouse.getLatitude(),
addressWareHouse.getLongitude());
wareHouseList.add(_temp);
for(int i=0;
i<wareHouseList.size();i++){
wareHouseMarker =
mMap.addMarker(new
MarkerOptions().position(_temp).title(modelWarehouse
.getName()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap
("map_warehouse", 52, 100))));
}
}
}
@Override
public void onChildChanged(DataSnapshot
dataSnapshot, String s) {
ModelWarehouse modelWarehouse =
dataSnapshot.getValue(ModelWarehouse.class);
if(companyID.equals(modelWarehouse.getCompanyID())){
ModelAddress addressWareHouse =
dataSnapshot.child("address").getValue(ModelAddress.
class);
LatLng _temp = new
LatLng(addressWareHouse.getLatitude(),
addressWareHouse.getLongitude());
if(!wareHouseList.contains(_temp)){
wareHouseList.add(_temp);
for(int i=0;
i<wareHouseList.size();i++){
wareHouseMarker =
312
mMap.addMarker(new
MarkerOptions().position(_temp).title(modelWarehouse
.getName()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap
("map_warehouse", 52, 100))));
}
}
}
}
@Override
public void onChildRemoved(DataSnapshot
dataSnapshot) {
ModelWarehouse modelWarehouse =
dataSnapshot.getValue(ModelWarehouse.class);
if(companyID.equals(modelWarehouse.getCompanyID())){
ModelAddress addressWareHouse =
dataSnapshot.child("address").getValue(ModelAddress.
class);
LatLng _temp = new
LatLng(addressWareHouse.getLatitude(),
addressWareHouse.getLongitude());
if(!wareHouseList.contains(_temp)){
wareHouseList.remove(_temp);
for(int i=0;
i<wareHouseList.size();i++){
wareHouseMarker =
mMap.addMarker(new
MarkerOptions().position(_temp).title(modelWarehouse
.getName()).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap
("map_warehouse", 52, 100))));
}
}
}
}
@Override
public void onChildMoved(DataSnapshot
dataSnapshot, String s) { }
@Override
public void onCancelled(DatabaseError
databaseError) {
313
}
};
new
FireDataWareHouse().ref.addChildEventListener(wareHo
useEventListener);
}
Gambar 5.144 US-AS4-2: Mengambil data lokasi gudang
private void getCompanyData(){
companyEventListener = new ValueEventListener()
{
@Override
public void onDataChange(DataSnapshot
dataSnapshot) {
companyToken =
dataSnapshot.child("token").getValue().toString();
ModelAddress address =
dataSnapshot.child("address").getValue(ModelAddress.
class);
companyLoc = new
LatLng(address.getLatitude(),
address.getLongitude());
Log.d("tsss", "Company Coordinate: " +
companyLoc);
if (companyMarker != null){
companyMarker.remove();
}
companyMarker = mMap.addMarker(new
MarkerOptions().position(companyLoc).title("Company"
).
icon(BitmapDescriptorFactory.fromBitmap(resizeBitmap
("map_company", 52, 100))));
}
@Override
public void onCancelled(DatabaseError
databaseError) {
}
};
new
FireDataCompany().ref.child(companyID).addListenerFo
rSingleValueEvent(companyEventListener);
}
Gambar 5.145 US-AS4-2: Mengambil data lokasi perusahan
314
1. Nama lengkap
315
if(TextUtils.isEmpty(newFullName)){
Toast.makeText(this, "new full name is
empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUser().writeUserFullName(user.getUid(),
newFullName, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
2. Email
Karena email merupakan cara user untuk login/otentikasi,
maka jika ingin merubah email, aplikasi harus merubahnya
316
if(matcher.matches()){
if(TextUtils.isEmpty(newEmail)){
Toast.makeText(this, "new email is empty",
Toast.LENGTH_SHORT).show();
return;
}
else{
user.updateEmail(newEmail).addOnCompleteListener(new
OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void>
task) {
if(task.isSuccessful()){
new
FireDataUser().writeUserEmail(user.getUid(), newEmail, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError, DatabaseReference
databaseReference) {
if(databaseError == null){
finish();
}
else{
e) {
if(TextUtils.isEmpty(password1)){
Toast.makeText(this, "new password is empty",
Toast.LENGTH_SHORT).show();
return;
}
else if(TextUtils.isEmpty(password2)){
Toast.makeText(this, "retype new password",
Toast.LENGTH_SHORT).show();
return;
}
else if(TextUtils.isEmpty(oldPassword)){
Toast.makeText(this, "fill the old password",
Toast.LENGTH_SHORT).show();
return;
}
else if(!password1.equals(password2)){
Toast.makeText(this, "new password didn't match",
Toast.LENGTH_SHORT).show();
return;
}
else if(!savedPassword.equals(oldPassword)){
Toast.makeText(this, "old password didn't match",
Toast.LENGTH_SHORT).show();
return;
}
}
Gambar 5.149 US-AS5-1: Cek kecocokan password lama,
cek ketepatan password baru
319
user.updatePassword(password1).addOnCompleteL
istener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull
Task<Void> task) {
new
FireDataUser().writeUserPassword(user.getUid(
), password1, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
Toast.makeText(EditPassword.this, "Error
while updating : " +
databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
}).addOnFailureListener(new
OnFailureListener() {
@Override
public void onFailure(@NonNull Exception
e) {
Toast.makeText(getApplicationContext(),
"error: " + e.getMessage(),
Toast.LENGTH_LONG).show();
return;
}
});
if(TextUtils.isEmpty(newLicense)){
Toast.makeText(this, "new license is
empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUser().writeUserLicense(user.getUid(),
newLicense, new
DatabaseReference.CompletionListener() {
@Override
public void onComplete(DatabaseError
databaseError, DatabaseReference databaseReference)
{
if(databaseError == null){
finish();
}
else{
5. Nomor telepon
Untuk mengedit nomor telepon, maka aplikasi mengambil
teks yang ada dalam EditText lalu menyimpannya dalam
database. Tidak ada aturan dan batasan yang didefinisikan
untuk mengisi nomor telepon. Kode yang digunakan
adalah pada gambar 5.152
321
@OnClick(R.id.btn_save_phonenumber) public
void btn_save_phonenumber(){
newPhone=
et_edit_phonenumber.getText().toString();
if(TextUtils.isEmpty(newPhone)){
Toast.makeText(this, "new phone
number is empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUser().writeUserPhone(user.getUid(),
newPhone, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
6. Alamat
Untuk mengedit alamat, user harus mengambil kordinat
alamat rumahnya pada peta menggunakan activity
Account_Set_Map. Setelah didapatkan, lalu
menyimpannya ke dalam database menggunakan kode
pada gambar 5.153.
322
Geocoder geocoder;
List<Address> addresses;
geocoder = new Geocoder(this,
Locale.getDefault());
try {
addresses =
geocoder.getFromLocation(latitude, longitude,1);
address =
addresses.get(0).getAddressLine(0);
et_edit_address.setText(address);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
7. Jenis kelamin
Untuk mengedit jenis kelamin, maka aplikasi mengambil
teks yang ada dalam EditText (male/female) lalu
menyimpannya dalam database. Namun tidak ada aturan
dan batasan yang didefinisikan agar user tidak mengisi
nilai selain itu. Kode yang digunakan adalah pada gambar
5.154.
8. Tanggal lahir
Untuk mengedit tanggal lahir, maka aplikasi mengambil
teks yang ada dalam EditText (MM/DD/YYYY). Namun
tidak ada aturan dan batasan yang didefinisikan agar user
tidak mengisi data selain dari format itu. Kode yang
digunakan adalah pada gambar 5.155.
9. Nama truk
Untuk mengedit nama truk, maka aplikasi mengambil teks
yang ada dalam EditText, lalu menyimpannya dalam
database menggunakan kode pada gambar 5.156
324
]+(0?[1-9]|[12][0-9]|3[01])+[/.-]+((19|20)\\d\\d)";
Matcher matcher =
Pattern.compile(expression).matcher(date);
if(matcher.matches()){
String value = matcher.group(0);
int month =
Integer.parseInt(value.substring(0,2));
int day =
Integer.parseInt(value.substring(3,5));
int year =
Integer.parseInt(value.substring(6));
Log.d("tsss","Value: "+ month + " : " + day
+ " : " + year);
return false;
}
else{
return true;
}
}
else{
Log.d("tsss", "matcher no match");
return false;
}
}
if(TextUtils.isEmpty(newBirthDate)){
Toast.makeText(this, "new birthdate is
empty", Toast.LENGTH_SHORT).show();
return;
}
else if(newBirthDate.length()!=10){
Toast.makeText(EditBirthdate.this, "input
format invalid", Toast.LENGTH_SHORT).show();
}
else{
boolean check = validate(newBirthDate);
if(check){
new
FireDataUser().writeUserBirthDate(user.getUid(),
newBirthDate, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
}
}
}
Gambar 5.155 US-AS5-1: Edit tanggal lahir sopir
@OnClick(R.id.btn_save_vehiclename) public
void btn_save_vehiclename(){
newTruckName =
et_edit_vehiclename.getText().toString();
if(TextUtils.isEmpty(newTruckName)){
Toast.makeText(this, "new truck name
is empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUser().writeUserTruckName(user.getUid
(), newTruckName, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
Toast.makeText(EditTruckName.this, "Error
while updating : " +
databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
}
@OnClick(R.id.btn_save_licenseplate) public
void btn_save_licenseplate(){
newPlate =
et_edit_licenseplate.getText().toString();
if(TextUtils.isEmpty(newPlate)){
Toast.makeText(this, "new Vehicle
Plate is empty", Toast.LENGTH_SHORT).show();
return;
}
else{
new
FireDataUser().writeUserTruckPlate(user.getUi
d(), newPlate, new
DatabaseReference.CompletionListener() {
@Override
public void
onComplete(DatabaseError databaseError,
DatabaseReference databaseReference) {
if(databaseError == null){
finish();
}
else{
Toast.makeText(EditTruckPlate.this, "Error
while updating : " +
databaseError.getDetails(),
Toast.LENGTH_SHORT).show();
}
}
});
}
}
mAuth.sendPasswordResetEmail(email).addOnComplete
Listener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull
Task<Void> task) {
Toast.makeText(getApplicationContext(), "Check
your email", Toast.LENGTH_SHORT).show();
}
});
}
}
Gambar 5.158 US-AS6-1: Reset Password
Framework Bootstrap v4
Bahasa Pemrograman Hypertext Preprocessing v5
Font Helvetica Neue
Database Firebase Database
330
function onClick() {
$('#login-btn').click(function() {
var _email = $('#login-email').val();
var _password = $('#login-password').val();
checkAccount(_email, _password);
});
}
snap.forEach(function(childSnapshot) {
countLoop++;
// var _key = childSnapshot.key;
var _email = childSnapshot.child("email").val();
if (email == _email) {
infoValidation(true);
loginAccount(email, password);
return true;
}
if (countUsers == countLoop)
infoValidation(false);
});
});
}
function infoValidation(isValid) {
if (isValid) {
$('#login-validate').text("");
$('#login-validate').css("display", "none");
} else {
$('#login-validate').text("*wrong email or
password");
$('#login-validate').css("display", "");
}
}
Gambar 5.160 US-WM1-1: fungsi login website
332
function monitorCompany() {
refUsers.on('child_added', function(data) {
var _companyID = data.key;
if (_companyID == userUID) {
var _lat =
data.child("address").child("latitude").val();
var _lng =
data.child("address").child("longitude").val();
companyName = data.child("fullname").val();
companyLatLng = {
lat: _lat,
lng: _lng
};
initMarker();
}
});
refUsers.on('child_changed', function(data) {
var _companyID = data.key;
var _name = data.child("name").val();
if (_companyID == userUID) {
var _lat =
data.child("address").child("latitude").val();
var _lng =
data.child("address").child("longitude").val();
companyName = data.child("fullname").val();
companyLatLng = {
lat: _lat,
lng: _lng
};
initMarker();
}
});
refUsers.on('child_removed', function(data) {
// do nothing
});
}
Gambar 5.161 US-WM2-1: Mengambil kordinat lokasi
perusahaan
334
function monitorFleet() {
var flagArray = 0;
refFleet.on('child_added', function(data) {
var _companyID =
data.child("companyID").val();
var _email = data.child("email").val();
var _lat =
data.child("location").child("latitude").val();
var _lng =
data.child("location").child("longitude").val();
var _fullname = data.child("fullname").val();
var _working = data.child("working").val();
if (_companyID == userUID) {
if (_working == false) {
arrEmailFleet1.push(_email);
arrLocFleet1[_email] = [_fullname, _lat,
_lng];
} else {
arrEmailFleet2.push(_email);
arrLocFleet2[_email] = [_fullname, _lat,
_lng];
}
initMarker();
}
flagArray++;
});
refFleet.on('child_changed', function(data) {
var _companyID =
data.child("companyID").val();
var _email = data.child("email").val();
var _lat =
data.child("location").child("latitude").val();
var _lng =
data.child("location").child("longitude").val();
var _fullname = data.child("fullname").val();
var _working = data.child("working").val();
if (_companyID == userUID) {
if (_working == false) {
arrLocFleet1[_email] = [_fullname, _lat,
_lng];
initMarker();
} else {
arrLocFleet2[_email] = [_fullname, _lat,
_lng];
initMarker();
335
}
});
}
Gambar 5.162 US-WM2-1: Mengambil kordinat lokasi
armada
function monitorWarehouse() {
var flagArray = 0;
refWarehouse.on('child_added', function(data) {
var _companyID = data.child("companyID").val();
var _id = data.key;
var _lat =
data.child("address").child("latitude").val();
var _lng =
data.child("address").child("longitude").val();
var _name = data.child("name").val();
if (_companyID == userUID) {
arrIDWarehouse.push(_id);
arrLocWarehouse[_id] = [_name, _lat, _lng];
initMarker();
}
flagArray++;
});
refWarehouse.on('child_changed', function(data) {
var _companyID = data.child("companyID").val();
var _id = data.key;
var _lat =
data.child("address").child("latitude").val();
var _lng =
data.child("address").child("longitude").val();
var _name = data.child("name").val();
if (_companyID == userUID) {
arrLocWarehouse[_id] = [_name, _lat, _lng];
initMarker();
}
});
}
Gambar 5.163 US-AS5-1: Mengambil kordinat lokasi gudang
336
function initMarker() {
google.maps.event.addListener(marker, 'click',
(function(marker, i) {
return function() {
infowindow.setContent(companyName);
infowindow.open(map, marker);
}
})(marker, i));
infowindow.setContent(arrLocFleet1[arrEmailFleet1[i
]][0]);
infowindow.open(map, marker);
337
}
})(marker, i));
}
google.maps.event.addListener(marker, 'click',
(function(marker, i) {
return function() {
infowindow.setContent(arrLocFleet2[arrEmailFleet2[i
]][0]);
infowindow.open(map, marker);
}
})(marker, i));
}
google.maps.event.addListener(marker, 'click',
(function(marker, j) {
return function() {
infowindow.setContent(arrLocWarehouse[arrIDWarehous
e[j]][0]);
infowindow.open(map, marker);
}
})(marker, j));
}
}
Gambar 5.164 US-WM2-1: Membuat marker-marker lokasi
338
6 BAB 6
UJI COBA
Pada baba ini dijelaskan hasil uji coba aplikasi yang sudah
berhasil di implementasikan baik uji coba fungsional sesuai
daftar user story pada table 4-3, 4-4, dan 4-5, maupun uji non-
fungsional yakni performa aplikasi.
Sign in Berhasil
dengan akun
armada
US-AM1-3 Mendaftarkan Mendaftarkan Gagal
aku armada dengan
beberapa
informasi
tidak
disertakan
Mendaftarkan Berhasil
dengan
semua
informasi
disertakan
Mendaftarkan Gagal
dengan email
yang sudah
ada
US-AM1-4 Mengedit Mengedit Berhasil
informasi akun email dan
perusahaan password
Mengedit Berhasil
informasi
pendukung
US-AM1-5 Mengedit Mengedit Berhasil
informasi akun informasi
armada pendukung
US-AM2-1 Membuat Membuat Berhasil
penugasan baru penugasan
dengan
semua data
diisikan
Membuat Gagal
penugasan
dengan
341
beberapa data
tidak diisikan
US-AM2-2 Melihat lokasi Melihat sopir Berhasil
dan tugas sopir di peta
Melihat sopir Berhasil
dalam list
US-AM2-3 Membatalkan Membatalkan Berhasil
pengiriman 1 penugasan
barang
US-AM2-4 Melihat Melihat Berhasil
penugasan yang daftar tugas
sedang berjalan yang belum
diselesaikan
Melihat detail Berhasil
deskripsi
tugas yang
belum
diselesaikan
Melihat detail Berhasil
riwayat lokasi
tugas yang
belum
diselesaikan
US-AM2-5 Melihat Melihat
penugasan yang daftar tugas Berhasil
sudah berakhir yang sudah
diselesaikan
Melihat detail Berhasil
deskripsi
tugas yang
sudah
diselesaikan
Melihat detail Berhasil
rute tugas
yang sudah
diselesaikan
342
yang berhasil
dan gagal
dikerjakan
armada
Smartphone Sopir Armada
US-AS1-1 Sign In Sign in Berhasil
dengan email
dan password
yang benar
Sign in Gagal
dengan akun
dummy
Sign in yang Berhasil
pertama kali
(Sign up)
Sign in Gagal
dengan akun
perusahaan
US-AS1-2 Menerima dan Melihat Berhasil
melihat tugas daftar tugas
yang diberikan yang belum
selesai
Melihat detail Berhasil
tugas yang
belum selesai
US-AS1-3 Mengajukan Mengajukan Berhasil
pengalihan ke 1 tugas ke
sopir lain sopir lain
US-AS2-1 Melihat tugas Melihat Berhasil
yang sudah daftar tugas
diselesaikan yang sudah
diselesaikan
Melihat detail Berhasil
deskripsi
tugas yang
344
sudah
diselesaikan
Melihat detail Berhasil
rute tugas
yang sudah
diselesaikan
US-AS3-1 Menyimpan Menyimpan Berhasil
riwayat lokasi riwayat lokasi
saat di database
melaksanakan dan
pengiriman meletakkan
barang marker-nya
di peta
US-AS3-2 Mengisi form Mengisi dan Berhasil
penyelesaian mengirimkan
tugas penyelesaian
tugas dengan
token yang
salah
Mengisi dan Berhasil
mengirimkan
tugas dengan
token yang
benar
US-AS3-3 Mengajukan Mengajukan Berhasil
pembatalan pembatalan
pengantaran semua tugas
tugas yang yang sedang
sedang dikerjakan
dikerjakan dalam 1
departure
Membatalkan Berhasil
saat ada tugas
yang sudah
selesai
US-AS3-4 Menerima Melihat Berhasil
konfirmasi apakah tugas
345
Aplikasi
Versi Android
1 2
JellyBean API 16 ☓ ☓
JellyBean API 18 ☓ ☓
KitKat API 19 ✓ ✓
Lollipop API 22 ✓ ✓
Marshmallow API 23 ✓ ✓
Nougat API 24 ✓ ✓
Nougat API 25 ✓ ✓
Oreo API 26 ✓ ✓
API 27 ✓ ✓
Durasi (detik)
Aktivitas
1 2 3 4
FlashActivitySignInAct 2, 285 3,079 2,136 2,299
ivity
FlashActivitySignUpA 0,384 0,204 0,789 1,290
ctivity
SignInActivityHomeAc 0,540 1,585 3,142 3,582
tivity
SignUpActivityHomeA 0,968 0,441 1,083 1,843
ctivity
HomeActivityOnGoing 0.753 0,656 1,557 2,165
Detail
HomeActivityFinished 0,366 0,405 1,152 2,119
Detail
350
Durasi (detik)
Aktivitas
1 2 3 4
FlashActivity 1,749 5,902 2,66 2,746
FlashActivitySignInAct 0,734 3,281 1,772 3,164
ivity
SignInActivityHomeAc 2,595 3,882 4,126 2,484
tivity (Sign In)
SignInActivityHomeAc 0,846 0,861 4,185 2,636
tivity (Sign Up)
HomeActivityNotFinis 0,740 0,680 1,395 2,610
hed_Detail
HomeActivityFinished 0,390 0,248 1,118 1,744
_Detail
HomeActivityEditFull 0,278 0,097 0,985 1,876
Name
HomeActivitySignInAc 0,311 0,148 0,899 1,556
tivity
HomeActivityTaskOng 1,438 6,926 1,176 1,948
oing
351
Halaman Web
Browser
login.html Dashboard.html
Mozilla Firefox mendukung mendukung
Chrome mendukung mendukung
Internet Explorer Tidak mendukung -
(saat login berhasil,
langsung kembali
ke halaman
login.html)
Ms. Edge Tidak mendukung -
(tidak membaca
firebase)
Puffin mendukung mendukung
352
7 BAB 7
KESIMPULAN DAN SARAN
Pada bab ini dijelaskan kesimpulan dan saran dari seluruh
pengerjaan Tugas Akhir. Kesimpulan dan saran diharapkan
dapat berguna untuk proses pengembangan aplikasi
selanjutnya.
7.1 Kesimpulan
Berdasarkan pengerjan Tugas Akhir ini, didapatkan beberapa
kesimpulan sebagai berikut:
7.2 Saran
Pada bagian ini akan dipaparkan kekurangan dari aplikasi Fleet
Monitoring System untuk penelitian selanjutnya agar diperbaiki
dan dikembangkan lagi. Berikut adalah masukan untuk
penelitian selanjutnya:
DAFTAR PUSTAKAs
https://developers.google.com/maps/documentation/android-
api/utility/setup. [Accessed 30 January 2017].
[23] Google, "The "How Might We" Note Taking Method - Understand
- Design Sprint Kit," [Online]. Available:
https://designsprintkit.withgoogle.com/methods/understand/hmw-
directions/. [Accessed 17 Mei 2017].
LAMPIRAN
Lampiran 1
362
Lampiran 2
363
Lampiran 3
364
Lampiran 4
365
Lampiran 5
366
Lampiran 6
367
Lampiran 7
368
Lampiran 8
369
Lampiran 9
370
Lampiran 10
371
Lampiran 11
372
Lampiran 12
373
Lampiran 13
374
Lampiran 14
375
Lampiran 15
376
Lampiran 16
377
Lampiran 17
378
Lampiran 18
379
Lampiran 19
380
Lampiran 20
381
Lampiran 21
382
Lampiran 22
383
BIODATA PENULIS