Some time ago, as an active user of personal task planners, I discovered one significant drawback - despite their uncountable number, it is impossible to find the “one” that would satisfy you on all points.
No, this in itself is absolutely normal, as the program was developed by one or several developers who eventually came to their own understanding of “how the user will be better”. And besides, it is impossible in one program to fit everything that a spherical user in a vacuum could theoretically want. Or maybe?

Why 2 functions in 1 application are better than 1 function in 1 application
Let's drop for a moment all the limitations and imagine that the ideal scheduler exists: it fully meets your expectations in terms of the interface, provides all the functions you need and works on all your devices. What does this give us? A key feature of this application will be the ability to use the same data to ensure the operation of all functions of the application.
We will simulate a situation - there are two users who cannot live without drawing up a list of tasks and using the Pomdoro equipment. Both have the same needs - the only difference is what applications they use to meet them:

A few words about how the user interacts with the program in both cases:
- User # 1: populates the Todoist task list, populates the list of projects in the Productivity Challenge Timer
- User # 2: fills out the task list inside his program

')
Based on the above illustration, you can identify some of the unpleasant moments that user # 1 will have to face, unlike user # 2:
- The need to manually synchronize the list of projects in both applications
- The inability to run Pomodoro cycles for the subtasks included in the project
- The lack of unified statistics on the implementation of tasks - it is stored in different applications
If this does not bother you, and you think that you can get by with several applications, then imagine what will happen if you need to provide the user with not two, but ten functions?
Solution to the problem
Well, one application in which there are all necessary functions is better, than several applications. But you can not develop a separate program for all combinations of functions! Everything turns out well, if not to use ... and why I break the comedy, the title says ... a modular approach!
The main secret of the "ideal" application is that you should not try to "predict" what the user wants there, but allow him to assemble his own "personal" application, which will meet his wishes and needs as fully as possible. The process of assembling such an application will be to select the desired functions of the application and aspects of the user interface, which will be represented by the corresponding modules.
In addition, it is obvious that if you correctly organize the process of developing such an application, then the overall complexity will be significantly reduced, since the implemented functions will not disappear anywhere - they are only “packed” into modules that are convenient for use by other developers.
This is not only theory
So that this article does not look like nonsense from a developer who has lost his mind on his theory, I would like to show how this all works on the example of my project. I will not describe it in this article for the time being - now I will only describe the idea itself. In general, there is a certain application X - at the moment it is possible to connect new modules to the system, where each module can significantly change the interface and expand the available functions of the application.
Here is the situation as in the example above, when the to-do list module is extended by the Pomodoro module:

At the moment, the application is under development, and is not ready to provide access to users. There is still a lot to do, but something is already there - for example, a list of the working functions of the application:
- Task list - tasks have the following properties: name, date, performed by Pomodoro, sketch
- Technique Pomodoro - run cycles Pomodoro for tasks from the task list
- Custom sketches - create sketches for saving in a separate gallery or linking to tasks from the task list
Each of the described functions is represented by a group of modules, each of which can be removed without affecting the performance of the entire system — removing the module will only exclude the corresponding function from the system for which it was responsible.
Perspectives
At the end of the article I would like to share with you my concepts for the further development and use of this project.
Interaction with the smart homeGiven : The application X is installed on the smartphone, the user stores his tasks, his daily routine and so on. In the place where he lives, the "smart home" system is installed.
Description : The application on the smartphone has data that can be used to improve the functioning of the smart home, namely: knowing the day schedule, you can adjust the light, turn on and off the music at a certain time, start home appliances (on waking, return home). In this case, the user does not have to manually configure the behavior of this system, since it uses the same data as it (as in the example with Pomodoro).
Already implemented modules : task list, interaction with DBMS
It is necessary to implement modules : Internet interaction or Bluetooth, a module for communicating with the smart home system, a module with logic for analyzing the day schedule for a smart home

Optimum planning of project implementation taking into account the user's lifestyleGiven : The application X is installed on the smartphone, the user stores his tasks, his daily routine and so on.
Description : With long-term use of the application, a large amount of data is accumulated, which can be used as input for machine learning algorithms. Thus, it will be possible to predict with some probability when the user will perform tasks depending on their urgency, importance, or attitude to any area of ​​life. Using prediction, it will be possible, for example, at the beginning of the day to generate variants of how he could spend today. In this case, all deadlines for current projects would be taken into account and an optimal schedule would be drawn up for their delivery on time.
Already implemented modules : task list, interaction with DBMS
It is necessary to implement modules : a machine learning module on sequences, a “predictions” generation module

Exercise controlGiven : The application X is installed on the smartphone and the user's PC, it stores its tasks, schedule and so on. The user has a fitness bracelet, which he always wears.
Description : The user decides to do sports (run in the morning, do exercises). On the smartphone and PC, the user selects applications and sites to which he will be cut down access. In the case of non-performance of sports activities, the user for some time gets reduced access to selected resources. Monitoring the implementation of sports activities is monitored according to data obtained from the bracelet.
Already implemented modules : interaction with DBMS
It is necessary to implement the modules : Internet interaction or Bluetooth, a module for interacting with a fitness bracelet, a module for restricting access to resources, a module for monitoring habits

In this article, I did not consider the features of the implementation, so as not to overload the text with details. I will certainly cover the development process itself, but in the next article. If someone is interested, you can familiarize yourself with the already implemented modules:
Currently implemented modules- MainMenuModel - stores links to currently connected plugins
- MainMenuView - provides a main menu UI
- TaskListModel - provides access to user tasks
- TaskListView - displays custom tasks in a tree view.
- PomodoroModel - provides access to completed Pomodoro
- PomodoroView - provides a UI to run Pomodoro loops and view them.
- TaskSketchModel - provides access to user sketches
- TaskSketchView - provides a UI for sketching
- AndroidNotificationsModel - provides access to Android platform-specific features.
- ExtendableDataBaseManager - provides access to abstract data structures that are independent of the source
- CipherDataBaseSource - provides methods for interacting with an encryption plugin for SQLight DBMS
The source code can be found at the
link .
Thanks for attention.