| Chức năng | Mô tả |
|---|---|
| Tạo mới Todo | ![]() |
| Sửa Todo | ![]() |
| Xoá và khôi phục Todo | ![]() |
| Tìm kiếm Todo | ![]() |
| Chia sẻ Todo | ![]() |
| Một số thao tác với Group | ![]() |
| Multi Select | ![]() |
| Thêm và nhận nhắc nhở | ![]() |
![]() |
|
| Widget cơ bản | ![]() |
-
Nhấn vào FAB ở góc phải dưới màn hình để tạo mới Todo.
-
Nhấn vào ChipTime để chọn thời gian nhắc nhở.
- Nhấn ChipGroup để chọn Group cho Todo:
-
Chọn các Group tương ứng để thay đổi Group cho Todo.
-
Chọn Tạo nhóm mới để mở ra BottomSheet Tạo nhóm mới:
Nút OK sẽ bị disable khi tên nhóm mới là 0 hoặc có độ dài > 100 ký tự.
- Khi nhấn Back trên thanh điều hướng sẽ thêm Todo mới vào Database.
- Nhấn vào CardView Todo để vào xem và sửa Todo, các cập nhật sẽ được trigger khi nhấn Back trên thanh điều hướng.
- Khi Title và Not đều rỗng thì sẽ không cập nhật Todo (quay lại trạng thái vừa mở).
- Khi nhấn vào checkbox để hoàn thành hoặc xoá Todo đều sẽ đưa Todo vào thùng rác.
Trên thực tế thì TodoStatus sẽ được chuyển đổi từ ON_GOING => DELETED or DONE (thùng rác sẽ load các Todo có TodoStatus là DELETED or DONE)
- Trong thùng rác có thể khôi phục hoặc xoá vĩnh viễn Todo.
- Khi khôi phục:
Chuyển TodoStatus thành DELETED. Tạo nhắc nhở mới nếu có AlarmTime != null. Tạo Group mới nếu GroupName != "".
- Sử dụng @Query và LIKE kết + doAfterTextChange + handle().delay để search:
Search bar thực tế là Edittext handle().delay để tránh doAfterTextChange check liên tục.
- Sử dụng ImplictIntent với ACTION_SEND để gửi Title và Note đi.
-
Group có thể đổi tên.
-
Xoá Group:
Xoá Group ra khỏi Database. Chuyển toàn bộ TodoStatus của các Todo trong Group đó sang DELETED. Huỷ toàn bộ nhắc nhở.
- Nhấn giữ Todo và kéo thả vào Group để thêm Todo từ ngoài màn hình vào 1 Group đã tồn tại.
Chuyển groupName thành Title của Group tương ứng.
-
Có thể chọn nhiều Todo và Group 1 lúc để thực hiện các thao tác:
-
Sử dụng 1 List để chứa các Item được chọn.
-
Sử dụng 1 biến để lưu trạng thái khi nào tiến vào chế độ Multi Select được đặt ở trong ViewModel.
-
Chỉ cần chọn thời gian nhắc nhở thì khi nhấn Back trên thanh điều hướng, ngay lập tức sẽ sử dụng AlarmManager để thêm nhắc nhở.
-
Thông báo đăng ký Channel với Important.HIGHT để hiện Headup trên màn hình.
-
Sử dụng id của Todo để làm id cho PendingIntent khi tạo 1 sự kiện bằng AlarmManager, khi xoá cũng xoá theo id.
-
Thông báo được custom khi mở rộng thông qua setCustomBigContentView().
-
Khi nhấn vào thông báo sẽ nhảy thẳng vào TodoFragment để xem chi tiết Todo bằng DeepLink (sử dụng NavDeepLinkBuilder).
- Nếu nhấn vào "Đánh dấu là hoàn thành" sẽ gửi tín hiệu tới ActionFromNotification (BroadcastReceiver):
Từ đây sẽ chuyển TodoStatus của Todo (xác định bằng id) thành DELETED. Gửi tín hiệu tới TodoWidget (AppWidgetProvider) để update Widget:
- Widget bao gồm 5 phần:
Phần tiêu đề Widget và dấu + (khi nhấn vào sẽ mở TodoFragment bằng cách dùng DeepLink cho phép tạo mới Todo) 4 phần còn lại là 4 Todo được mở gần nhất, có thể ấn vào để xem Todo tương tự dấu +. Todo nào đang có nhắc nhở thì sẽ có icon đồng hồ bên cạnh Title.
- Widget được update khi 1 Todo được update (xoá, checkdone, sửa, xem,...)
- Todo:
Date được convert thành Long qua file Converter để Room lưu trữ được.
- Group:
- GroupWithTodos:
- Sử dụng Relation 1:N để duyệt 2 bảng, trả về 1 Group với N Todo.
- Sử dụng @DatabaseView để thêm điều kiện vào GroupWithTodos.
- Thường sẽ chứa các LiveData chứa dữ liệu của các RecyclerView ở các Fragment.
Khi LiveData thay đổi sẽ update lại RecyclerView tương ứng.
- Mỗi Fragment thường sẽ có 1 ViewModel tương ứng.
- Riêng OnGoingFragment và GarbageFragment có các logic và dữ liệu chung và có thể update qua lại giữa các RecyclerView nên sẽ có HomeShareViewModel dùng chung
2 Fragment này là 2 Pager của HomeFragment.
Lưu ý là khi tạo ViewModel ở 2 Fragment kể trên cần chú ý phần ViewModelStoreOwner sẽ là requireParentFragment() và ở HomeFragment là this
Làm vậy để từ HomeFragment hay 2 Fragment kia có thể update 2 Fragment còn lại khi thay đổi LiveData tương ứng (do có chung ViewModelStoreOwner là HomeFragment)





























