To-do list app for Android that simplifies day-to-day task scheduling by sorting tasks based on their priority, ensuring dependencies are completed first.
  • Kotlin 86.1%
  • DM 13.9%
Find a file
2026-07-04 14:58:12 +01:00
app Initial commit 2026-07-04 14:58:12 +01:00
gradle Initial commit 2026-07-04 14:58:12 +01:00
.gitignore Initial commit 2026-07-04 14:58:12 +01:00
build.gradle.kts Initial commit 2026-07-04 14:58:12 +01:00
gradle.properties Initial commit 2026-07-04 14:58:12 +01:00
gradlew Initial commit 2026-07-04 14:58:12 +01:00
gradlew.bat Initial commit 2026-07-04 14:58:12 +01:00
README.md Initial commit 2026-07-04 14:58:12 +01:00
settings.gradle.kts Initial commit 2026-07-04 14:58:12 +01:00

Todoto

Introduction

Todoto is a to-do list app designed to make day-to-day task scheduling quick and simple. Users can add tasks to their list, each with a set priority. Tasks can also be linked to dependencies that must be completed first. They can then sort tasks into a schedule, letting them complete each task in sequence without missing out on dependencies.

API Requirements

The app targets API 34, and should run on these devices. That said, compileSdk is set to 35 in the project configuration.

Usage

Main menu

Upon starting the app, you will begin with a clean slate. Tap the (+) icon in the bottom-right corner to add a new to-do item. Tap the "Sort" button to sort the to-do items. Long-press on an item to bring up a context menu to delete the item.

Editing items

Tapping on any item on the main menu will bring you to the edit menu to allow you to edit it. On the edit menu, you can set the item's title, description, and priority. If you wish, you can select a photo from your gallery to use as an icon.

You can also add dependencies to an item. These are tasks that must be completed before this one. Tapping the "Add" button will display the to-do list, allowing you to select an item to add as a dependency (but an item cannot depend on itself). To remove a dependency, tap the "X" icon.

Preferences

Tapping the preferences icon in the bottom-left corner of the main menu will bring you to the preferences menu. You may enable dark theme, or synchronise with your system theme. Enabling "Recycle Item IDs" will allow deleted items to have their IDs re-used when creating new items. If disabled, new items will take the next largest ID.

Design Rationale

The app is split into two main activities - the main menu, and the edit menu. This allows data for the to-do items to be passed between the two activities easily via explicit intents, and allows the user to easily move back and forth between the menus. Where possible, ConstraintLayouts were preferred over other layouts, due to their improved performance. Additionally, using hierarchies of layouts such as LinearLayout resulted in shadows being clipped at the boundaries of the layout, and prevented edge-to-edge content display, so they were impractical for most cases.

The main menu displays to-do items using a RecyclerView, as-per the project requirements. Data can be quickly loaded into a dynamic scrollable list with minimal overhead, and items can be seamlessly added, removed, and sorted. The same is true for the dependency list on the edit menu.

Preferences are handled with SharedPreferences for simple, rapid access, satisfying the project requirements. To-do items are serialized and stored in the todo_items.json file in filesDir, allowing fast saving and loading of bulk data. Icon images are loaded and stored via URI, to avoid inflating file size by copying thumbnails.

Novel Features

Sorting

Items are sorted with a topological sort, such that dependencies for an item will be placed before the item that depends on them, and then sorted by priority. This results in the following ordering:

  • Dependencies for high-priority tasks
  • High-priority tasks
  • Dependencies for low-priority tasks
  • Low-priority tasks

A user can therefore work down the list in sequence, completing high priority items once their dependencies are fulfilled. As such, a day's work can be assessed at a glance, and schedules can be assigned dynamically without relying on manual organization.

Challenges and Future Improvements

A critical challenge involved was time management. Due to circumstances in my personal life, I missed a lot of lecture content, and therefore had to schedule in time for both re-learning the module content, and also developing the application. This was resolved with careful scheduling of tasks for each day, forming a roadmap of when certain objectives needed to be completed. This scheduling process inspired the concept for the app itself.

A potential future improvement would be to give the user more control over the sorting. Currently, the user is given a schedule that follows the defined scheduling rules, but is given no option to adjust it. The resulting output is also non-deterministic, and will result in different schedules from different initial orderings. It would be useful if the user could move items around manually, or perhaps set deadlines that could be used to further inform the sorting algorithm. In addition, the sorting system currently uses notifyDataSetChanged() to update data, which is inefficient and lacks animations. It could be nice to track the movements of items during sorting, and update them each with notifyItemMoved() instead. Moreover, the current sorting method does not scale well, and could likely be improved by storing a map of item IDs to item objects. Finally, there is currently no system to detect dependency cycles. The app could perhaps warn the user when a cycle is detected, to prevent undefined sorting behavior.