Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 146 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
146
Dung lượng
5,35 MB
Nội dung
BỘ GIÁO DỤC VÀ ĐÀO TẠO TRƯỜNG ĐẠI HỌC BÀ RỊA-VŨNG TÀU ĐỒ ÁN TỐT NGHIỆP Ứng dụng “Quản lý phịng trọ” h Trình độ đào tạo: Đại học quy Ngành: Cơng nghệ thơng tin Chun ngành: Lập trình ứng dụng di động game Giảng viên hướng dẫn: ThS Nguyễn Thị Minh Nương Sinh viên thực hiện: MSSV: 17031538 Lê Thành Trung Lớp: DH17LT Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu LỜI CAM ĐOAN Đồ án trình nghiên cứu xây dựng cá nhân tơi, hướng dẫn giáo viên ThS Nguyễn Thị Minh Nương Các số liệu, kết luận nghiên cứu trình bày đồ án tơi tự tìm hiểu hồn tồn trung thực Ngồi ra, báo cáo có sử dụng số nguồn tài liệu tham khảo trích dẫn nguồn thích rõ ràng Tơi xin hồn tồn chịu trách nhiệm lời cam đoan Vũng Tàu,Ngày 01 tháng 01 năm 2021 Sinh viên thực Lê Thành Trung h GVHD: ThS Nguyễn Thị Minh Nương Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu LỜI CẢM ƠN Trong khoảng thời gian học tập Trường Đại Học Bà Rịa – Vũng Tàu, nhận hướng dẫn, giúp đỡ quý báu thầy cô Điều giúp tơi tạo điều kiện tích lũy vốn kiến thức bổ ích từ giảng, kiến thức thực tế thầy cô Tôi xin gửi lời cảm ơn chân thành tri ân sâu sắc quý thầy cô Trường Đại Học Bà Rịa Vũng Tàu nói chung thầy khoa Cơng Nghệ Kỹ Thuật – Nông Nghiệp – Công Nghệ Cao trường nói riêng tạo điều kiện thuận lợi để tơi hồn thành tốt đồ án Đặc biệt tơi xin chân thành cảm ơn đến cô ThS Nguyễn Thị Minh Nương – người tận tình hướng dẫn, giúp đỡ tơi hồn thành đồ án tốt nghiệp Tơi xin kính chúc q thầy có nhiều sức khỏe, gặt hái nhiều thành công đường giảng dạy, chúc Trường Đại Học Bà Rịa – Vũng Tàu lựa chọn hàng đầu hệ sinh viên để học tập nâng cao trình độ thân Với điều kiện thời gian kinh nghiệm cịn hạn chế nên báo cáo khơng thể tránh thiếu sót Tơi mong nhận góp ý kiến q thầy để tơi h học thêm nhiều kinh nghiệm, nâng cao kiến thức Tôi xin chân thành cảm ơn! GVHD: ThS Nguyễn Thị Minh Nương Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu NHẬN XÉT CỦA GIẢNG VIÊN HƯỚNG DẪN h Vũng Tàu, ngày … tháng … năm 20… Người hướng dẫn ThS Nguyễn Thị Minh Nương GVHD: ThS Nguyễn Thị Minh Nương Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu MỤC LỤC DANH MỤC CÁC TỪ VIẾT TẮT i DANH MỤC BẢNG ii DANH MỤC SƠ ĐỒ iv DANH MỤC HÌNH v LỜI NÓI ĐẦU ix Chương Cơ sở lý thuyết 1.1 Hệ điều hành Android 1.1.1 Giới thiệu Android 1.1.2 Lịch sử phát triển Android 1.1.3 Các thành phần ứng dụng 1.2 Ngôn ngữ Kotlin 1.2.1 Giới thiệu Kotlin h 1.2.2 Kotlin Android 1.2.3 Lịch sử phát triển Kotlin 1.2.4 Ưu nhược điểm Kotlin so với Java 1.3 Firebase Google 13 1.3.1 Giới thiệu 13 1.3.2 Lịch sử phát triển 13 1.3.3 Các dịch vụ Firebase 14 1.4 Thư viện MPAndroidChart 16 1.4.1 Giới thiệu 16 1.4.2 Các dạng biểu đồ 17 1.5 Thư viện ZXing 19 1.5.1 Giới thiệu 19 1.5.2 Lịch sử hình thành 20 GVHD: ThS Nguyễn Thị Minh Nương Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Chương Phân tích hệ thống 21 2.1 Mô tả chức chi tiết 21 2.1.1 Quản lý tài khoản Firebase Authenticator 21 2.1.2 Quản lý sở liệu Firebase Realtime Database 22 2.1.3 Quản lý nội dung phương tiện người dùng 23 2.2 Xác định tác nhân 24 2.2.1 Tác nhân Admin 24 2.2.2 Tác nhân user người cho thuê phòng 25 2.2.3 Tác nhân người thuê phòng 25 2.3 Đặc tả use case 26 2.3.1 Đăng nhập vào hệ thống 26 2.3.2 Thống kê 28 2.3.3 Tìm kiếm liệu 29 h 2.3.4 Xem thông tin tài khoản 30 2.3.5 Cập nhật liệu 31 2.4 Xây dựng sở liệu 32 2.4.1 Các thực thể thuộc tính 32 2.4.2 Sơ đồ ER 34 2.4.3 Sơ đồ quan hệ 34 Chương Xây dựng phần mềm Motel Management 35 3.1 Danh sách hình 35 3.2 Màn hình chờ 36 3.3 Đăng nhập hệ thống 38 3.4 Màn hình đăng ký tài khoản 42 3.5 Màn hình quên mật 49 3.6 Màn hình 52 GVHD: ThS Nguyễn Thị Minh Nương Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu 3.7 Màn hình khu vực quản lý – Dashboard 57 3.8 Màn hình đổi mật 68 3.9 Màn hình thơng tin chi tiết phịng 70 3.10 Giao diện chi tiết hóa đơn 77 3.11 Giao diện chi tiết người trọ 80 3.12 Giao diện thêm/ cập nhật người trọ 82 3.13 Giao diện thêm dịch vụ 84 3.14 Giao diện thêm hóa đơn 88 3.15 Giao diện ghi số điện nước 91 3.16 Giao diện popup hiển thị thơng tin phịng 93 3.17 Giao diện popup hiển thị thơng tin hóa đơn 95 Chương Xây dựng phần mềm Search Motel Information 97 4.1 Danh sách hình 97 h 4.2 Màn hình chờ 97 4.3 Màn hình quét mã truy cập hệ thống 98 4.4 Màn hình 101 4.4.1 Thẻ home – Màn hình thơng tin phịng 102 4.4.2 Thẻ bills – Màn hình danh sách hóa đơn 102 4.4.3 Thẻ lodgers - Màn hình danh sách thành viên 103 4.4.4 Thẻ report – Màn hình thống kê 105 Chương Kết luận 106 5.1 Kết đạt 106 5.2 Hướng phát triển 106 Tài liệu tham khảo 107 Phụ lục 109 GVHD: ThS Nguyễn Thị Minh Nương Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu DANH MỤC CÁC TỪ VIẾT TẮT Từ viết tắt Miêu tả Cmnd Chứng minh nhân dân Cccd Căn cước công dân h GVHD: ThS Nguyễn Thị Minh Nương i Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu DANH MỤC BẢNG Bảng 2.1 Bảng mơ tả chức có trang quản lý tài khoản Firebase 21 Bảng 2.2 Bảng mô tả chức trang quản lý sở liệu 22 Bảng 2.3 Mô tả chức trang quản lý liệu Firebase Storage 23 Bảng 2.4 Bảng mơ tả thuộc tính thực thể 32 Bảng 3.1 Danh sách hình phần mềm Motel Management 35 Bảng 3.2 Bảng mơ tả hình chờ 36 Bảng 3.3 Bảng mơ tả hình đăng nhập 39 Bảng 3.4 Bảng mơ tả hình đăng kí 43 Bảng 3.5 Bảng mô tả hình khơi phục mật 49 Bảng 3.6 Bảng mô tả hình 52 Bảng 3.7 Mô tả chi tiết dòng danh sách phòng 54 Bảng 3.8 Mô tả chức hình dashboard 58 Bảng 3.9 Bảng mơ tả hình thơng tin tài khoản 59 Bảng 3.10 Bảng mơ tả danh sách hóa đơn 61 Bảng 3.11 Mơ tả liệu item tiêu đề hóa đơn 62 h Bảng 3.12 Mô tả liệu item hóa đơn 63 Bảng 3.13 Bảng mơ tả hình danh sách dịch vụ 64 Bảng 3.14 Mô tả thông tin item chi tiết dịch vụ 64 Bảng 3.15 Bảng mô tả hình thống kê 66 Bảng 3.16 Mô tả liệu hình thơng tin phịng 70 Bảng 3.17 Mơ tả liệu hình danh sách hóa đơn phòng 73 Bảng 3.18 Mơ tả liệu hình danh sách thành viên phòng 74 Bảng 3.19 Mô tả liệu item thành viên danh sách thành viên phòng 75 Bảng 3.20 Mơ tả liệu hình thống kê điện nước 76 Bảng 3.21 Mơ tả liệu hình chi tiết hóa đơn 78 Bảng 3.22 Mơ tả liệu hình chi tiết thành viên phòng 80 Bảng 3.23 Bảng mơ tả hình thêm thành viên phòng 83 Bảng 3.24 Bảng mơ tả hình tạo dịch vụ 85 Bảng 3.25 Bảng mơ tả hình thêm hóa đơn 88 GVHD: ThS Nguyễn Thị Minh Nương ii Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Bảng 3.26 Bảng mơ tả thiết kế hình popup 3.54 94 Bảng 4.1 Bảng mơ tả hình ứng dụng Search Motel Information 97 Bảng 4.2 Mơ tả chi tiết hình qt mã Qr code 98 h GVHD: ThS Nguyễn Thị Minh Nương iii Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Hình phụ lục Cấu trúc thư mục anim Trong thư mục gồm có hai class BaseViewAnimator, ZoomInDownAnimator Hai class có ý nghĩa class trừu tượng hiệu ứng, class lại class định nghĩa hiệu ứng Code class BaseViewAnimator sau: h abstract class BaseViewAnimator { val DURATION: Long = 1000 private var mAnimatorSet: AnimatorSet? = null private var mDuration = DURATION private var mRepeatTimes = private var mRepeatMode = ValueAnimator.RESTART init { mAnimatorSet = AnimatorSet() } protected abstract fun prepare(target: View) open fun setTarget(target: View): BaseViewAnimator? { reset(target) prepare(target) return this } open fun animate() { start() } open fun restart() { mAnimatorSet = mAnimatorSet!!.clone() start() } /** * reset the view to default status * * @param target */ open fun reset(target: View?) { ViewCompat.setAlpha(target, 1f) ViewCompat.setScaleX(target, 1f) ViewCompat.setScaleY(target, 1f) ViewCompat.setTranslationX(target, 0f) ViewCompat.setTranslationY(target, 0f) ViewCompat.setRotation(target, 0f) ViewCompat.setRotationY(target, 0f) ViewCompat.setRotationX(target, 0f) } /** * start to animate */ open fun start() { GVHD: ThS Nguyễn Thị Minh Nương 114 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu for (animator in mAnimatorSet!!.childAnimations) { if (animator is ValueAnimator) { animator.repeatCount = mRepeatTimes animator.repeatMode = mRepeatMode } } mAnimatorSet!!.duration = mDuration mAnimatorSet!!.start() h } open fun setDuration(duration: Long): BaseViewAnimator? { mDuration = duration return this } open fun setStartDelay(delay: Long): BaseViewAnimator? { getAnimatorAgent()!!.startDelay = delay return this } open fun getStartDelay(): Long { return mAnimatorSet!!.startDelay } open fun addAnimatorListener(l: Animator.AnimatorListener?): BaseViewAnimator? { mAnimatorSet!!.addListener(l) return this } open fun cancel() { mAnimatorSet!!.cancel() } open fun isRunning(): Boolean { return mAnimatorSet!!.isRunning } open fun isStarted(): Boolean { return mAnimatorSet!!.isStarted } open fun removeAnimatorListener(l: Animator.AnimatorListener) { mAnimatorSet!!.removeListener(l) } open fun removeAllListener() { mAnimatorSet!!.removeAllListeners() } open fun setInterpolator(interpolator: Interpolator): BaseViewAnimator { mAnimatorSet!!.interpolator = interpolator return this } open fun getDuration(): Long { return mDuration } open fun getAnimatorAgent(): AnimatorSet { return mAnimatorSet!! } open fun setRepeatTimes(repeatTimes: Int): BaseViewAnimator { mRepeatTimes = repeatTimes return this } open fun setRepeatMode(repeatMode: Int): BaseViewAnimator { mRepeatMode = repeatMode return this } } Code class ZoomInDownAnimator sau: class ZoomInDownAnimator: BaseViewAnimator() { override fun prepare(target: View) { getAnimatorAgent().playTogether( ObjectAnimator.ofFloat(target, "scaleX", 0.1f, 0.475f,1.0f), ObjectAnimator.ofFloat(target, "scaleY", 0.1f, 0.475f,1.0f), ObjectAnimator.ofFloat(target, "translationY", -target.bottom*1.0f, 60*1.0f,0f), ObjectAnimator.ofFloat(target, "alpha", 0.0f, 1.0f, 1.0f) ); } } GVHD: ThS Nguyễn Thị Minh Nương 115 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Hình phụ lục Cấu trúc thư mục common Code class ValidationHelpers – có chức kiểm tra liệu đầu vào: const val EMAIL_REGEX = "(?:[a-z0-9!#\$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#\$%&'*+/=?^_`{|}~]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9]*[a-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][09]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])" const val MIN_CREDENTIAL_LENGTH = const val MIN_JOKE_LENGTH = 10 fun isEmailValid(email: String) = Pattern.matches(EMAIL_REGEX, email) fun isPasswordValid(password: String) = password.length >= MIN_CREDENTIAL_LENGTH fun isUsernameValid(username: String) = username.length >= MIN_CREDENTIAL_LENGTH fun arePasswordsSame(password: String, repeatPassword: String) = isPasswordValid(password) && isPasswordValid(repeatPassword) && password == repeatPassword fun isValidJoke(jokeText: String) = jokeText.length >= MIN_JOKE_LENGTH h Hình phụ lục Cấu trúc thư mục event Code Class PaginationListener: abstract class PaginationListener(private val layoutManager: LinearLayoutManager): RecyclerView.OnScrollListener() { companion object{ const val PAGE_START = const val PAGE_SIZE = 10 } /** * Set scrolling threshold here (for now i'm assuming 10 item in one page) */ override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) { super.onScrollStateChanged(recyclerView, newState) } override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) GVHD: ThS Nguyễn Thị Minh Nương 116 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu val visibleItemCount = layoutManager.childCount val totalItemCount = layoutManager.itemCount val firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition() if (!isLoading() && !isLastPage()) { if (visibleItemCount + firstVisibleItemPosition >= totalItemCount && firstVisibleItemPosition >= && totalItemCount >= PAGE_SIZE) { loadMoreItems() } } } protected abstract fun loadMoreItems() abstract fun isLastPage(): Boolean abstract fun isLoading(): Boolean } h Hình phụ lục Cấu trúc thư mục fragment Code class BottomSheetInfoBill, class BottomSheetInfoRoom xử lý tương tự: class BottomSheetInfoBill(val data: Bill): BottomSheetDialogFragment() { private lateinit var txtRoomName: TextView private lateinit var txtDescription: TextView private lateinit var txtTimeCreate: TextView private lateinit var txtTimePaid: TextView private lateinit var txtTotalBill: TextView private lateinit var txtBillStatus: TextView private lateinit var imgIconBill:ImageView private lateinit var btnPayment:Button private lateinit var btnClose:Button override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view:View=inflater.inflate(R.layout.bottom_sheet_info_bill, container, false) txtRoomName=view.findViewById(R.id.txtRoomName) txtDescription=view.findViewById(R.id.txtDescription) txtTimeCreate=view.findViewById(R.id.txtTimeCreate) txtTimePaid=view.findViewById(R.id.txtTimePaid) txtTotalBill=view.findViewById(R.id.txtTotalBill) txtBillStatus=view.findViewById(R.id.txtBillStatus) imgIconBill=view.findViewById(R.id.imgIconBill) btnPayment=view.findViewById(R.id.btnPayment) btnClose=view.findViewById(R.id.btnClose) return view } override fun getTheme(): Int = R.style.BottomSheetDialog override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) addControls() GVHD: ThS Nguyễn Thị Minh Nương 117 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu addEvents() } private fun addControls() { if (data.id.isNotEmpty()){ val roomOfBill:Room=SplashScreenActivity.listRooms.filter { p->p.id==data.roomId }[0] txtRoomName.text=roomOfBill.roomName if (data.description.isNotEmpty()){ txtDescription.text=data.description } txtTimeCreate.text= MyString.convertLongToTime(data.createDateBill,"dd-MM-yyyy HH:mm") if (data.dateOfPayment!=0L){ txtTimePaid.text= MyString.convertLongToTime(data.createDateBill,"dd-MM-yyyy HH:mm") }else{ txtBillStatus.text="Unpaid" txtBillStatus.setTextColor(resources.getColor(R.color.colorRed)) btnPayment.visibility=View.VISIBLE } txtTotalBill.text=MyString.convertNumberFormat("%,.0f", data.total).plus( "đ" ) val totalBill:ArrayList = SplashScreenActivity.listDetailBills.filter { p->p.billId==data.id } as ArrayList if (context!=null){ if (totalBill.size==1){ h val service: Service = (SplashScreenActivity.listServices.filter { p>p.id==totalBill[0].serviceId })[0] val uri:String = "@drawable/".plus(service.imageName) // where myresource (without the extension) is the file var imageResource:Int = requireContext().resources.getIdentifier(uri, null, requireContext().packageName) val res: Drawable = requireContext().resources.getDrawable(imageResource, null) imgIconBill.setImageDrawable(res) }else{ imgIconBill.setImageResource(R.drawable.ic_bill) } } } } private fun addEvents() { btnClose.setOnClickListener { dialog?.dismiss() } btnPayment.setOnClickListener { if (data.dateOfPayment!=0L||data.id.isEmpty()){ return@setOnClickListener } var database:DatabaseReference= Firebase.database.reference val dateOfPayment:Long= Calendar.getInstance().timeInMillis data.dateOfPayment=dateOfPayment val myRef: DatabaseReference = database.child(Configs.TableName_Bill) myRef.child(data.id).setValue(data).addOnCompleteListener {task-> if (task.isSuccessful){ dialog?.dismiss() Toast.makeText(it.context,"Payment Successful!!",Toast.LENGTH_LONG).show() /* Snackbar.make(it, "Payment Successful!!", Snackbar.LENGTH_LONG) setAction("Action", null).show()*/ }else{ dialog?.dismiss() Toast.makeText(it.context,"Payment fail!!",Toast.LENGTH_LONG).show() /*Snackbar.make(it, "Payment fail!!", Snackbar.LENGTH_LONG) setAction("Action", null).show()*/ } } } } GVHD: ThS Nguyễn Thị Minh Nương 118 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu h GVHD: ThS Nguyễn Thị Minh Nương 119 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Code class HomeFragment, class ListBillFragment, ListLodgerFragment, ReportFragment xử lý tương tự: h class HomeFragment : Fragment() { // TODO: Rename and change types of parameters private var param1: String? = null private var param2: String? = null private lateinit var roomSelected: Room override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) arguments?.let { param1 = it.getString(ARG_PARAM1) param2 = it.getString(ARG_PARAM2) } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment_home, container, false) } override fun onActivityCreated(savedInstanceState: Bundle?) { super.onActivityCreated(savedInstanceState) (requireActivity() as AppCompatActivity).supportActionBar?.hide() addControls() addEvents() } private fun addEvents() { btnGenerateQRCode.setOnClickListener { startActivity(Intent(activity, GenerateQrCodeActivity::class.java)) } imgEditRoom.setOnClickListener { val intent:Intent=Intent(activity, RoomActivity::class.java) intent.putExtra("RoomSelected", InfoRoomActivity.roomSelected) startActivity(intent) } btnAddLodger.setOnClickListener { val intent:Intent=Intent(activity, LodgerActivity::class.java) startActivity(intent) } btnConfirmCheckOut.setOnClickListener { val totalBillUnpaid:Int=(SplashScreenActivity.listBills.filter { p>(p.roomId==roomSelected.id&&p.dateOfPayment==0L) }).size if (totalBillUnpaid>0){ val builder = AlertDialog.Builder(context) builder.setTitle("Error!") builder.setMessage("Please payment all bill(unpaid)!") builder.setPositiveButton("Go to payment", DialogInterface.OnClickListener { dialog, which -> dialog.dismiss() val intent: Intent = Intent(context, BillActivity::class.java) intent.putExtra("RoomSelected", InfoRoomActivity.roomSelected) startActivity(intent) }) builder.setNegativeButton("No", DialogInterface.OnClickListener { dialog, which -> dialog.dismiss() }) builder.create().show() return@setOnClickListener } InfoRoomActivity.roomSelected.isFull=false val myRef2: DatabaseReference = Firebase.database.reference.child(Configs.TableName_Room) myRef2.child(InfoRoomActivity.roomSelected.id).setValue(InfoRoomActivity.roomSelected).addOnCo mpleteListener { task -> if (task.isSuccessful) { Toast.makeText(activity, "Room status is empty", Toast.LENGTH_LONG).show() } } val listLodger:ArrayList = SplashScreenActivity.listLodgers.filter { p>p.roomId==InfoRoomActivity.roomSelected.id } as ArrayList GVHD: ThS Nguyễn Thị Minh Nương 120 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu h for (lodger:Lodger in listLodger){ val myRef3: DatabaseReference = Firebase.database.reference.child(Configs.TableName_Lodger) lodger.roomId="" myRef3.child(lodger.id).setValue(lodger) } val ft: FragmentTransaction = requireFragmentManager().beginTransaction() ft.detach(this).attach(this).commit() } } private fun addControls() { roomSelected = if (InfoRoomActivity.roomSelected!=null){ InfoRoomActivity.roomSelected }else{ Room() } txtRoomName.text=roomSelected.roomName txtRoomRate.text= MyString.Companion.convertNumberFormat("%,d", roomSelected.roomRate).plus( " đ" ) startCountAnimation(txtElectricityIndex, 0, roomSelected.electricityIndex) startCountAnimation(txtWaterIndex, 0, roomSelected.waterIndex) /*txtElectricityIndex.text=roomSelected.electricityIndex.toString() txtWaterIndex.text=roomSelected.waterIndex.toString()*/ if (!roomSelected.isFull){ txtRoomStatus.text= "Empty" // imgIconRoom.setImageResource(R.drawable.ic_room_empty) btnConfirmCheckOut.visibility=View.GONE btnAddLodger.visibility=View.VISIBLE } val totalLodger:Int=(SplashScreenActivity.listLodgers.filter { p>p.roomId==roomSelected.id }).size startCountAnimation(txtTotalLodger, 0, totalLodger) val totalBill:Int=(SplashScreenActivity.listBills.filter { p>p.roomId==roomSelected.id }).size startCountAnimation(txtTotalBill, 0, totalBill) txtRoomId.text=roomSelected.id val totalBillUnpaid:Int=(SplashScreenActivity.listBills.filter { p>(p.roomId==roomSelected.id&&p.dateOfPayment==0L) }).size startCountAnimation(txtTotalBillUnPaid, 0, totalBillUnpaid) } private fun startCountAnimation( view: TextView, numberStart: Int = 0, numberEnd: Int = 600, duration: Long = 1000L ) { val animator = ValueAnimator.ofInt(numberStart, numberEnd) //0 is number, 600 is max number animator.duration = duration //Duration is in milliseconds animator.addUpdateListener { animation -> view.text = animation.animatedValue.toString() } animator.start() } companion object { /** // TODO: Rename and change types and number of parameters @JvmStatic fun newInstance(param1: String, param2: String) = HomeFragment().apply { arguments = Bundle().apply { putString(ARG_PARAM1, param1) putString(ARG_PARAM2, param2) } } } } GVHD: ThS Nguyễn Thị Minh Nương 121 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Hình phụ lục Cấu trúc thư mục model Bảng phụ lục Bảng mô tả cấu trúc thư mục hình phụ lục Ý nghĩa STT Tên Class Bill Class trừu tượng hóa hóa đơn DetailBill Class trừu tượng hóa chi tiết hóa đơn DetailRoom Class trừu tượng hóa chi tiết phịng Lodger Class trừu tượng hóa người th phịng Room Class trừu tượng hóa phịng Service Class trừu tượng hóa dịch vụ GVHD: ThS Nguyễn Thị Minh Nương h 122 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Code class Bill, class DetailBill, DetailRoom, Lodger, Room, Service xử lý tương tự: h class Bill:Serializable { private var _id:String="" private var _billName:String="" private var _createDateBill:Long = private var _dateOfPayment:Long =0 private var _total:Double=0.0 private var _roomId:String="" var _isSection:Boolean=false private var _description:String="" constructor(){} constructor(_id: String,_billName:String, _createDateBill: Long, _dateOfPayment: Long, _roomId: String,_isSection:Boolean=false,_total:Double, _description:String="") { this._id = _id this._billName = _billName this._createDateBill = _createDateBill this._dateOfPayment = _dateOfPayment this._roomId = _roomId this._isSection=_isSection this._total=_total this._description=_description } var id:String get() { return _id } set(value) { this._id=value } var billName:String get() { return _billName } set(value) { this._billName=value } var description:String get() { return _description } set(value) { this._description=value } var createDateBill: Long get() { return _createDateBill } set(value) { this._createDateBill=value } var total: Double get() { return _total } set(value) { this._total=value } var dateOfPayment: Long get() { return _dateOfPayment } set(value) { this._dateOfPayment=value } var roomId:String get() { return _roomId } set(value) { this._roomId=value GVHD: ThS Nguyễn Thị Minh Nương 123 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu } override fun toString(): String { return this._billName } fun copy(bill:Bill, _isSection:Boolean=false):Bill{ return Bill(bill.id,bill.billName,bill.createDateBill,bill.dateOfPayment,bill.roomId,_isSection,bill total,bill.description) } } h Hình phụ lục Cấu trúc thư mục activity - hình GVHD: ThS Nguyễn Thị Minh Nương 124 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Bảng phụ lục Bảng mô tả cấu trúc thư mục hình phụ lục Ý nghĩa STT Tên Class AddBillActivity Class xử lý hình thêm hóa đơn AddDetailBill Class xử lý hình thêm chi tiết hóa đơn AddServiceActivity Class xử lý hình thêm/ cập nhật dịch vụ BillActivity Class xử lý hình thêm/ cập nhật hóa đơn DashBoardActivity Class xử lý hình quản trị viên DetailBillActivity Class xử lý hình chi tiết hóa đơn DetailLodgerActivity Class xử lý hình thơng tin chi tiết người thuê GenerateQrCodeActivity Class xử lý hình khởi tạo mã Qr code InfoRoomActivity Class xử lý hình thơng tin phịng 10 LodgerActivity Class xử lý hình người th phịng 11 LoginActivity Class xử lý hình đăng nhập 12 MainActivity Class xử lý hình 13 ProfileActivity Class xử lý hình hiển thị thông tin tài khoản 14 RegisterActivity Class xử lý hình tạo tài khoản 15 ReportActivity Class xử lý hình thống kê 16 ResetPasswordActivity Class xử lý hình khơi phục mật 17 RoomActivity Class xử lý hình thêm/ cập nhật phịng 18 ServiceActivity Class xử lý hình danh sách dịch vụ 19 SplashScreenActivity Class xử lý hình chờ 20 WriteIndexActivity Class xử lý hình ghi số điện nước GVHD: ThS Nguyễn Thị Minh Nương h 125 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Phụ lục B Cấu trúc ứng dụng Search Motel Information h Hình phụ lục 10 Cấu trúc chung ứng dụng Search Motel Information Hình phụ lục 11 Cấu trúc thư mục com.thanhtrung Bảng phụ lục Bảng mô tả cấu trúc thư mục hình phụ lục 11 STT Tên thư mục GVHD: ThS Nguyễn Thị Minh Nương Ý nghĩa 126 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu adapters Thư mục chứa class giúp giao tiếp View liệu hệ thống Từ hiển thị lên hình người dùng common Thư mục chứa class sử dụng chung cho dự án event Thư mục chứa class tạo kiện RecyclerView fragment Thư mục chứa class xử lý hình fragment models Thư mục chứa class đối tượng ứng dụng motelroomttlodger Thư mục chứa class xử lý hình os Thư mục chưa class liên quan đến đọc ghi file others Thư mục chứa class xử lý khác view Thư mục chứa class View tự tùy chỉnh để phù hợp với ứng dụng h Hình phụ lục 12 Cấu trúc thư mục adapters Hình phụ lục 13 Cấu trúc thư mục common, event, fragment GVHD: ThS Nguyễn Thị Minh Nương 127 Sinh Viên:Lê Thành Trung Đồ án tốt nghiệp đại học – Khóa 20117-2021 Trường Đại Học Bà Rịa Vũng Tàu Hình phụ lục 14 Cấu trúc thư mục models Hình phụ lục 15 Cấu trúc thư mục motelroomttlodger h Hình phụ lục 16 Cấu trúc thư mục os, others, view GVHD: ThS Nguyễn Thị Minh Nương 128 Sinh Viên:Lê Thành Trung