Skip to content

Commit f4207af

Browse files
authored
docs: setup MkDocs documentation with GitHub Actions automation (#102)
* docs: setup MkDocs documentation with GitHub Actions automation * docs: update * docs: update * docs: update
1 parent 140159f commit f4207af

12 files changed

Lines changed: 666 additions & 0 deletions

File tree

.github/workflows/deploy-docs.yml

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
name: Deploy Documentation
2+
3+
on:
4+
push:
5+
branches:
6+
- main # Замени на master, если у тебя главная ветка называется master
7+
8+
permissions:
9+
contents: write
10+
11+
jobs:
12+
deploy:
13+
runs-on: ubuntu-latest
14+
steps:
15+
- uses: actions/checkout@v4
16+
17+
- name: Configure Python
18+
uses: actions/setup-python@v5
19+
with:
20+
python-version: 3.x
21+
22+
- name: Install dependencies
23+
run: pip install mkdocs-material
24+
25+
- name: Deploy to GitHub Pages
26+
run: mkdocs gh-deploy --force

docs/app/ui.md

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
# Архитектура UI-слоя (Presentation Layer)
2+
3+
Презентационный слой приложения разработан на базе **Jetpack Compose** и реализует реактивный подход к отображению данных. Управление состоянием разделено на два подхода в зависимости от специфики экрана: использование классического `StateFlow` (для авторизации и онбординга) и прямое использование `mutableStateOf` во ViewModel для минимизации оверхеда при частых обновлениях (списки заметок, редактор).
4+
5+
---
6+
7+
## 1. Компоненты UI-слоя
8+
9+
Вся бизнес-логика презентации инкапсулирована во ViewModels, которые внедряются в UI-компоненты с помощью DI-фреймворка **Koin**.
10+
11+
| ViewModel | Тип состояния | Стратегия навигации | Архитектурная роль |
12+
| :--- | :--- | :--- | :--- |
13+
| `AuthViewModel` | `StateFlow<AuthUiState>` | Шаги внутри экрана (`AuthScreenStep`) | Управление сессией пользователя (Firebase Auth / Google Sign-In), валидация и обработка ошибок входа. |
14+
| `OnboardingViewModel` | `MutableStateFlow` / `StateFlow` | Пошаговый интерактивный тур | Подсчет координат целевых элементов (`Rect`), управление подсказками и сохранение флага завершения в `Preferences`. |
15+
| `NotesViewModel` | `mutableStateOf(NotesUiState)` | Стейт-ориентированная (`NotesUiScreen`) | Главный координатор списков: папки, заметки, поиск, избранное. Управляет навигацией через изменение поля `screen`. |
16+
| `EditorViewModel` | Раздельные `mutableStateOf` поля | Назад (BackHandler) | Облегченная модель для изоляции состояния конкретной редактируемой заметки (динамический ввод текста, вложения). |
17+
18+
---
19+
20+
## 2. Схемы управления состоянием и навигации
21+
22+
### Стейт-ориентированная навигация в списках (`NotesViewModel`)
23+
24+
В отличие от классического Jetpack Compose Navigation, переключение между экраном папок (`Directories`) и экраном заметок конкретной папки (`Notes`) происходит декларативно через изменение свойства `uiState.screen` типа `NotesUiScreen`. Это позволяет сохранять контекст данных без сложной передачи аргументов по строковым путям.
25+
26+
```mermaid
27+
graph LR
28+
A[DirectoriesScreen] -- Выбор папки / Клик --> B(NotesViewModel.onDirectoryClick)
29+
B --> C[Обновление uiState.screen = NotesUiScreen.Notes]
30+
C --> D[Рекомпозиция: NotesScreen]
31+
D -- Системный BackHandler --> E(NotesViewModel.onBack)
32+
E --> F[Обновление uiState.screen = NotesUiScreen.Directories]
33+
```
34+
35+
###Архитектура потока данных в редакторе (EditorViewModel)
36+
Для предотвращения лишних рекомпозиций всего экрана при каждом нажатии клавиши (вводе символа в BasicTextField), EditorViewModel не использует единый объект Data Class для всего стейта. Вместо этого ключевые свойства разнесены по атомарным наблюдаемым полям:
37+
38+
```kotlin
39+
graph TD
40+
UI[EditorScreen: BasicTextField] -- onValueChange --> VM_Change(EditorViewModel.onContentChange)
41+
VM_Change --> VM_State[var content: String by mutableStateOf]
42+
VM_State --> UI_Recompose[Быстрая рекомпозиция только текстового поля]
43+
44+
UI_Save[Кнопка Назад / Автосохранение] --> VM_Build(EditorViewModel.buildUpdatedNote)
45+
VM_Build --> Domain[NotesUseCases.updateNoteUseCase]
46+
```
47+
48+
##3. Спецификация экранов и UI-компонентов
49+
####Экраны списков (DirectoriesScreen & NotesScreen)
50+
Особенности реализации: Активно используют LazyColumn со строго типизированными элементами интерфейса (DirectoryItemUi, NoteItemUi).
51+
52+
####Поиск:
53+
Поисковый запрос обрабатывается реактивно через SearchNotesUseCase. Поле ввода интегрировано с модулем онбординга через кастомный модификатор .onboardingTarget().
54+
55+
####Контекстные действия:
56+
Длинный тап на папку или заметку активирует режим выбора/удаления, минуя открытие карточки.
57+
58+
####Экран редактора (EditorScreen)
59+
#####Компонент ввода:
60+
Построен на базе BasicTextField с кастомной декорацией (editorPlainTextFieldDecoration), что обеспечивает плавный скролл и адаптацию под экранную клавиатуру.
61+
62+
#####Медиавложения:
63+
Поддерживает динамическое добавление элементов ContentItem (изображения, файлы, ссылки). Список вложений фильтруется с помощью расширения .withoutTextItems(), отделяя бинарный контент от тела заметки.
64+
65+
#####Перехват системных кнопок:
66+
На экранах авторизации и редактирования явно объявлен BackHandler, предотвращающий случайное закрытие приложения или потерю несохраненного текста.
67+
68+
##4. Внедрение зависимостей (DI) в AppModule.kt
69+
Регистрация ViewModels и связывание их с доменным слоем (Use Cases) вынесены в модуль Koin. ViewModels списков и онбординга регистрируются через viewModelOf для автоматического разрешения конструкторов, а AuthViewModel настраивается вручную для явной передачи контекста приложения:
70+
```kotlin
71+
val appModule = module {
72+
// Фабрики Use Cases
73+
factory { NotesUseCases(...) }
74+
75+
// Презентационный слой
76+
viewModelOf(::NotesViewModel)
77+
viewModelOf(::OnboardingViewModel)
78+
viewModel {
79+
AuthViewModel(
80+
firebaseAuth = get(),
81+
app = androidApplication(),
82+
appSessionPreferences = get(),
83+
clearLocalDataOnSignOut = get()
84+
)
85+
}
86+
}
87+
```

docs/architecture/onboarding.md

Whitespace-only changes.

docs/architecture/overview.md

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
# Архитектура и технологический стек
2+
3+
Проект строго следует принципам **Clean Architecture** (Чистой архитектуры) и разделен на изолированные модули. Это обеспечивает независимость бизнес-логики от изменений в UI-слое, базах данных или сторонних ИИ-библиотеках.
4+
5+
<br>
6+
7+
### 🏗 Структура модулей
8+
9+
Здесь представлена схема зависимостей модулей проекта. Каждый модуль выполняет строго определенную роль в архитектуре.
10+
11+
```mermaid
12+
graph TD
13+
app[":app (UI & DI Layer)"] --> domain[":domain (Core Business Logic)"]
14+
data[":data (Data Layer & Room & Firebase)"] --> domain
15+
ai[":ai (OpenVINO AI Layer)"] --> domain
16+
```
17+
18+
###📝 Описание роли модулей
19+
:domain — Слой является центральным и наиболее стабильным слоем приложения. Он содержит бизнес-логику, не зависящую от деталей реализации пользовательского интерфейса, источников данных и внешних фреймворков. Слой спроектирован в соответствии с принципами чистой архитектуры: все зависимости направлены внутрь, а доменные сущности и сценарии использования не имеют ссылок на внешние слои.
20+
21+
:app — Слой UI. Отвечает за представление (Jetpack Compose / MVVM) и внедрение зависимостей (Dependency Injection). Получает данные через domain-слой и отображает их пользователю.
22+
23+
:data — Слой данных. Реализует интерфейсы репозиториев, определенных в модуле domain. Отвечает за работу с локальной БД Room и синхронизацию с Firebase Storage.
24+
25+
:ai — Слой является слоем инфраструктуры, отвечающим за интеграцию с нейросетевыми моделями. Он содержит конкретную реализацию интерфейса NoteAiService, определённого в Domain-слое, и обеспечивает выполнение моделей искусственного интеллекта на устройстве с использованием библиотеки OpenVINO. Слой инкапсулирует всю специфику работы с нейросетевым движком: загрузку моделей, предобработку данных, инференс и постобработку результатов.
26+
27+
###🛠 Детальный технологический стек
28+
Спецификация используемых технологий и библиотек, разделенная по уровням абстракции:
29+
30+
####1. Платформа и Язык
31+
Язык разработки: Kotlin (строгая типизация, Null-Safety, расширения).
32+
33+
Минимальная версия Android SDK: API 26+ (для обеспечения совместимости с современными ИИ-библиотеками).
34+
35+
Целевая версия Android SDK: API 37.
36+
37+
####2. Инференс ИИ на устройстве (On-Device AI)
38+
Среда исполнения: OpenVINO™ Toolkit (Java API фреймворка, оптимизированный под мобильные процессоры).
39+
40+
Нейросетевые модели: Семейство моделей YOLO (YOLOv10 / YOLOv26).
41+
42+
Адаптивная оптимизация: Архитектура приложения поддерживает динамическое переключение моделей ИИ в зависимости от аппаратных возможностей устройства. Для современных смартфонов с мощными NPU/GPU загружаются старшие версии моделей, а для более старых устройств — легковесные квантованные версии, что гарантирует стабильный FPS и экономию заряда батареи.
43+
44+
####3. Асинхронность и Реактивность
45+
Управление потоками: Kotlin Coroutines (использование suspend функций, концепции структурной асинхронности, явные вызовы await() для обработки отложенных результатов вычислений нейросетей).
46+
47+
Реактивные потоки: Kotlin Flows (StateFlow / SharedFlow). UI-слой реактивно подписывается на изменения состояний, что исключает утечки памяти и гарантирует корректное обновление интерфейса при фоновой обработке данных (например, во время инференса или синхронизации).
48+
49+
####4. Локальное и Облачное хранение (Data Layer)
50+
Локальная база данных: Room ORM (абстракция над SQLite с compile-time проверкой SQL-запросов). Используется для мгновенного доступа к заметкам в офлайн-режиме.
51+
52+
Удаленное облачное хранилище: Firebase Storage.
53+
54+
Архитектура синхронизации: Для каждого пользователя в облаке создается изолированная директория, разделенная на два логических блока:
55+
56+
/notes/*.json — структурированные текстовые данные заметок, сериализованные в легковесный формат JSON.
57+
58+
/media/* — связанные бинарные медиафайлы (изображения, аудиозаписи).
59+
Такой подход обеспечивает высокую скорость синхронизации без необходимости поддержки сложных реляционных СУБД на бэкенде.
60+
61+
####5. Архитектурные инструменты
62+
Внедрение зависимостей (DI): Koin — легковесный, нативный для Kotlin фреймворк Service Locator. Используется для управления временами жизни объектов (Scopes) и слабой связанности компонентов между модулями.

docs/architecture/presentation.md

Whitespace-only changes.

0 commit comments

Comments
 (0)