Общее видение проекта
Разработка мобильного финансового инструмента часто ограничивается простыми трекерами расходов или базовыми списками задач. В данном случае цель была гораздо амбициознее: собрать в одном приложении всё, что необходимо для личного финансового планирования — от учёта доходов и расходов до аналитики, целей накоплений, помодоро‑таймера и системы заметок. Всё это реализовано на чистом Kotlin с использованием современного UI‑фреймворка Jetpack Compose, без сторонних UI‑библиотек и тяжёлых зависимостей.
Архитектурный подход
Для обеспечения масштабируемости и тестируемости выбран принцип чистой архитектуры (Clean Architecture). Слой домена содержит бизнес‑модели (Transaction, Budget, Goal, PomodoroSession) и интерфейсы репозиториев. Инфраструктурный слой реализует эти репозитории, используя Room для локального хранилища и DataStore для настроек пользователя. Презентер‑уровень реализован через ViewModel из Android Architecture Components, а поток данных передаётся в UI через StateFlow и LiveData. Такое разделение позволяет легко заменять источники данных (например, добавить синхронизацию с облаком) без изменения бизнес‑логики.
UI‑слой на Jetpack Compose
Jetpack Compose стал ядром визуального представления. Каждый крупный модуль (Транзакции, Бюджет, Цели, Помодоро) оформлен в виде отдельного Composable, что упрощает повторное использование и тестирование. Навигация построена на NavHost и NavController, позволяя динамически менять стек экранов без фрагментов.
Для адаптивности использованы Modifier‑комбинации, поддержка разных размеров экранов реализована через WindowSizeClass. Тёмная тема и пользовательские стили оформлены в едином MaterialTheme, где цвета и типографика задаются в ColorScheme и Typography. Благодаря декларативному подходу UI мгновенно реагирует на изменения состояния в ViewModel.
Основные функции
Транзакции и бюджет
Пользователь может создавать, редактировать и удалять финансовые операции, указывая сумму, категорию, дату и комментарий. Автоматическая группировка по месяцам и категориям позволяет быстро увидеть текущий финансовый статус. Бюджетный модуль задаёт лимиты на категории, а система предупреждает о превышении.
Аналитика
На основе записанных транзакций генерируются графики расходов и доходов с помощью Charts‑компонентов, построенных на Canvas. Показатели, такие как средний расход, процент от дохода и динамика изменения бюджета, обновляются в реальном времени.
Заметки и задачи
Встроенный редактор заметок поддерживает Markdown‑разметку, что упрощает структурирование информации. Задачи привязываются к финансовым целям, позволяя планировать крупные покупки или инвестиции.
Помодоро‑таймер
Таймер реализован как отдельный Composable, синхронизированный с системой уведомлений. Пользователь задаёт длительность работы и перерыва, а приложение сохраняет статистику сессий, отображая её в аналитике продуктивности.
Цели накоплений
Модуль целей позволяет задавать целевую сумму, срок и автоматическое распределение средств из текущих транзакций. Прогресс отображается в виде кольцевой диаграммы, а при достижении цели пользователь получает уведомление.
Хранение данных
Room используется в качестве основной БД. Таблицы построены на основе Entity‑классов, а миграции управляются автоматически через AutoMigration. Для небольших настроек (выбор темы, длительность таймера, валюты) применён DataStore‑преференс, что обеспечивает асинхронный доступ без блокировок UI‑потока.
Интеграция помодоро‑таймера
Таймер работает в фоне, используя WorkManager для гарантии выполнения даже при закрытом приложении. События начала и завершения сессии отправляются в ViewModel через MutableSharedFlow, что позволяет отображать текущий статус таймера в любой части интерфейса.
Проблемы и решения
-
Состояние UI при конфигурационных изменениях – первоначально данные терялись при повороте экрана. Перешёл на хранение состояния в
SavedStateHandleвнутриViewModel, что решило проблему без дополнительных библиотек. -
Оптимизация рендеринга графиков – при большом количестве точек графики тормозили. Было решено использовать
LazyColumnс отложенной отрисовкой и кэшировать вычисленные координаты в памяти. -
Тестирование бизнес‑логики – изоляция репозиториев позволила писать юнит‑тесты с использованием
FakeRepository. Тесты покрывают 85 % кода домена, что повышает надёжность при дальнейшем расширении.
Выводы из разработки
Создание комплексного финансового приложения в одиночку стало возможным благодаря модульности Jetpack Compose и строгой архитектуре. Декларативный UI существенно сократил количество кода, связанного с управлением состоянием, а разделение слоёв позволило сосредоточиться на бизнес‑логике без привязки к платформенным деталям.
Перспективы развития
Планируется добавить синхронизацию с облачными сервисами (Google Drive, Firebase) для резервного копирования и мульти‑устройственного доступа. Также рассматривается внедрение машинного обучения для предсказания будущих расходов на основе исторических данных. Расширение аналитики за счёт интеграции с финансовыми API (например, курсы валют) повысит полезность приложения для более продвинутых пользователей.