Skip to content

S4ltF1sh/TodoApp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Chức năng:

Chức năng Mô tả
Tạo mới Todo Tạo mới Todo
Sửa Todo Sửa Todo
Xoá và khôi phục Todo Xoá và khôi phục Todo
Tìm kiếm Todo Tìm kiếm Todo
Chia sẻ Todo Chia sẻ Todo
Một số thao tác với Group Một số thao tác với Group (2)
Multi Select Multi Select
Thêm và nhận nhắc nhở Thêm nhắc nhở
Nhận nhắc nhở
Widget cơ bản Widget Cơ bản

Chi tiết chức năng:

Tạo mới Todo:

  1. Nhấn vào FAB ở góc phải dưới màn hình để tạo mới Todo.

  2. Nhấn vào ChipTime để chọn thời gian nhắc nhở.

image

  1. Nhấn ChipGroup để chọn Group cho Todo:

image

  • 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:

image

Nút OK sẽ bị disable khi tên nhóm mới là 0 hoặc có độ dài > 100 ký tự.

image

  1. Khi nhấn Back trên thanh điều hướng sẽ thêm Todo mới vào Database.

Sửa Todo:

  • 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ở).

Xoá và khôi phục Todo:

  • 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.

image

  • 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 != "".

Tìm kiếm Todo:

  • 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.

image

image

Chia sẻ Todo:

  • Sử dụng ImplictIntent với ACTION_SEND để gửi Title và Note đi.

image

Một số thao tác với Group:

  • 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.

Multi Select:

  • 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.

Thêm và nhận nhắc nhở:

  • 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.

image

  • 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).

image

  • 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:

image

Widget cơ bản:

  • 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.

image

  • Widget được update khi 1 Todo được update (xoá, checkdone, sửa, xem,...)

Database:

  1. Todo:

image

Date được convert thành Long qua file Converter để Room lưu trữ được.

image

  1. Group:

image

  1. 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.

image

ViewModel:

  • 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.

image

  • 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.

image

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

image image

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)

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages