Initial import of f7cloud-mobile native Android app.

Kotlin/Compose client for F7cloud (mail, files, talk, calendar, contacts, tasks, support).
Current version: 0.5.113 (build 121).
This commit is contained in:
F7cloud Mobile
2026-07-07 12:05:18 +03:00
commit fd17df80a8
1789 changed files with 246889 additions and 0 deletions
+317
View File
@@ -0,0 +1,317 @@
# F7cloud Mobile — статус проекта и журнал работ
Документ описывает текущее состояние нативного Android-приложения **f7cloud-mobile**, выполненные задачи, процесс сборки APK и актуальную версию.
**Дата обновления:** 7 июля 2026
**Расположение проекта:** `/var/www/f7cloud/f7cloud-mobile`
**Сервер:** `https://forbion.f7cloud.ru`
---
## Текущая версия
| Параметр | Значение |
|----------|----------|
| **versionName** | `0.5.113` |
| **versionCode** | `121` |
| **applicationId** | `ru.forbion.f7cloud.mobile` |
| **Последний APK (debug)** | `app/build/outputs/apk/debug/f7cloud-mobile-v0.5.113-121-debug.apk` |
| **Размер APK** | ~130 МБ |
Версия задаётся в `app/build.gradle`:
```gradle
versionCode 121
versionName '0.5.113'
```
При каждой значимой сборке `versionCode` увеличивается на 1, `versionName` — по схеме `0.5.xxx`.
---
## Сборка APK
### Чем собирается
Сборка выполняется **на сервере** в каталоге проекта с помощью **Gradle Wrapper** — отдельный от legacy-проекта `android-webview`.
| Компонент | Версия |
|-----------|--------|
| Gradle | **9.3.0** (`gradle/wrapper/gradle-wrapper.properties`) |
| Android Gradle Plugin (AGP) | **8.13.2** |
| Kotlin | **2.3.0** |
| Jetpack Compose BOM | **2025.02.00** |
| compileSdk / targetSdk | **36** |
| minSdk | **26** |
| JDK на сервере | **OpenJDK 21** |
> С v0.5.27 используется собственный wrapper в `f7cloud-mobile`. Старый способ через `android-webview` (Gradle 8.7, AGP 8.2) **не поддерживается** — несовместим с Kotlin 2.3.
### Команды
**Debug APK** (основной способ для тестирования на устройстве):
```bash
cd /var/www/f7cloud/f7cloud-mobile
./gradlew assembleDebug
chown www-data:www-data app/build/outputs/apk/debug/*.apk
```
**Release APK** (с minify и shrink resources):
```bash
cd /var/www/f7cloud/f7cloud-mobile
./gradlew assembleRelease
```
**Сборка отдельного модуля** (проверка компиляции без полной сборки app):
```bash
./gradlew :feature:tasks:compileDebugKotlin
```
### Имя выходного файла
Шаблон задаётся в `app/build.gradle`:
```
f7cloud-mobile-v{versionName}-{versionCode}-{variant}.apk
```
Пример: `f7cloud-mobile-v0.5.113-121-debug.apk`
### Где лежит APK
```
/var/www/f7cloud/f7cloud-mobile/app/build/outputs/apk/debug/
/var/www/f7cloud/f7cloud-mobile/app/build/outputs/apk/release/
```
### Как собирает ассистент (Cursor Agent)
1. Вносит изменения в Kotlin/Compose-код.
2. При необходимости увеличивает `versionCode` / `versionName` в `app/build.gradle`.
3. Запускает `./gradlew assembleDebug` (или `:app:assembleDebug`).
4. Проверяет, что сборка завершилась с `BUILD SUCCESSFUL`.
5. Сообщает путь к APK.
Коммиты в git создаются **только по явной просьбе** пользователя.
---
## Архитектура проекта
Нативное приложение на **Kotlin + Jetpack Compose**. Не WebView-оболочка (legacy: `android-webview`).
```
f7cloud-mobile/
├── app/ # Точка входа, навигация (AppScaffold, AppNavigation)
├── core/
│ ├── auth/ # Сессия, авторизация
│ ├── network/ # HTTP, WebDAV, CalDAV, OCS API
│ ├── designsystem/ # F7Colors, компоненты UI, нижняя панель, меню
│ ├── push/ # Firebase push-уведомления
│ ├── database/ # Room (локальный кэш)
│ └── ui/ # Общие UI-утилиты
├── feature/
│ ├── files/ # Файлы (WebDAV)
│ ├── talk/ # Talk UI, офлайн-чат
│ ├── talk-native/ # Нативные звонки (обёртка vendor/talk-android)
│ ├── mail/ # Почта
│ ├── calendar/ # Календарь (CalDAV)
│ ├── contacts/ # Контакты (CardDAV)
│ ├── tasks/ # Задачи (CalDAV)
│ ├── deck/ # Карточки (Deck)
│ └── f7support/ # Техподдержка
├── vendor/talk-android/ # Форк Nextcloud Talk (нативные конференции)
└── design/ # Макеты PNG, токены, CSS-эталоны
```
### Навигация
- Нижняя панель зависит от активной вкладки (`F7BottomBarConfig.kt`).
- Меню приложений — полноэкранная панель `F7AppMenuSheet` (кнопка «гамбургер»).
- Стартовая вкладка после входа — **Файлы**.
- В активной конференции нижняя панель **скрывается** (`talkInRoom`).
### Дизайн-система
Цвета и компоненты из темы forbion (`core/designsystem/F7Colors.kt`):
| Токен | Значение |
|-------|----------|
| Primary | `#70B62B` |
| Background | `#FBFBFB` |
| Surface | `#FFFFFF` |
| Text primary | `#151515` |
| Text secondary | `#808080` |
| Border | `#E6E6E6` |
Иконки подгружаются с сервера: `https://forbion.f7cloud.ru/themes/forbion/images/...`
Макеты для вёрстки: `design/screens/`, эталонный CSS веб-версии: `themes/forbion/css/pages/`.
---
## Выполненные работы (хронология)
Ниже — основные блоки работ, выполненных в ходе разработки нативного приложения (сессии Cursor Agent, весна–лето 2026).
### Общая платформа
- Переход на Kotlin 2.3 + Compose + Gradle 9.3 / AGP 8.13.
- Модульная архитектура `app` / `core` / `feature` / `vendor`.
- Глобальный safe area (`enableEdgeToEdge`, `F7WindowInsets`) — исправление перекрытия статус-бара на Samsung Z и других устройствах с вырезом.
- Swipe-to-dismiss для оверлеев (`F7OverlayNavigation.kt`, `f7SwipeFromRightToDismiss`).
- Push-уведомления через Firebase (`core/push`).
### Меню приложений (`F7AppMenuSheet`)
- Полноэкранная белая панель `#FBFBFB` без затемнения (по `_header.css`).
- Поиск приложений сверху.
- Сетка 4 колонки, иконки 62×62 dp, подписи 12sp bold.
- Нижняя панель остаётся видимой (90 dp снизу).
- Внешние сайты (Bitrix, 1C UNF и др.) подгружаются через `AppMenuRepository`.
### Конференции / Talk (`talk-native`, `vendor/talk-android`)
- Нативные звонки через форк Nextcloud Talk.
- **Исправление повторного подключения к звонку** после завершения предыдущего (`CallActivity.onNewIntent`, сброс `ApplicationWideCurrentRoomHolder`, очистка в `TalkNativeCallLauncher`) — баг с конференцией «Топ Дейли» у markov.aa.
### Почта (`feature/mail`)
- Нативный список писем, папки, поиск, переписки (threads).
- Просмотр письма: HTML в WebView, текстовые письма в Compose.
- Меню действий «⋯» с иконками на белом фоне (ответить, избранное, спам, метки, переместить и т.д.).
- Свайп справа налево для закрытия письма.
- Исправления крашей при открытии HTML-писем (вложенная прокрутка, `fillMaxSize` в `Column`).
- **Фоновая предзагрузка тел писем** (до 60 писем, 3 параллельно) — v0.5.104.
- **Параметры эл. почты** (`MailSettingsScreens.kt`) по макету `AppSettingsMenu.vue`:
- Основные, учётные записи, внешний вид, текстовые шаблоны, конфиденциальность, безопасность.
- API: preferences, trusted senders, text blocks в `MailRepository`.
- **Запланированная отправка** при просмотре письма — открывает compose-ответ с выбранным временем (вместо snooze входящего).
### Календарь (`feature/calendar`)
- Виды: День, Неделя, Месяц, Год, Список.
- Боковая панель навигации по календарям.
- Расширенный редактор событий: повторения, участники, Talk, напоминания, RSVP.
- Корзина, незапланированные задачи, создание календаря, импорт `.ics`, настройки.
- Исправление краша `LazyColumn` с бесконечной высотой (v0.5.92).
- Вёрстка по макетам из `design/screens/calendar/` и CSS `_calendar-*-mobile.css`.
### Контакты (`feature/contacts`)
- Список контактов CardDAV, поиск, группы.
- Карточка контакта: email, телефон, адрес, организация, аватар.
### Техподдержка (`feature/f7support`)
- Нативный канбан тикетов, чат, создание обращений, вложения.
- **Composer чата** (`SupportChatComposerBar`) — pill-поле с эмодзи, скрепкой и круглой кнопкой отправки (как в Talk).
- Исправление выравнивания кнопки отправки (`Alignment.CenterVertically`).
### Задачи (`feature/tasks`) — последняя крупная доработка (v0.5.113)
Дизайн по макетам `design/screens/tasks/` и CSS `_tasks-main-mobile.css`, `_tasks-sidebar-mobile.css`:
| Компонент | Файл | Описание |
|-----------|------|----------|
| `TasksToolbar` | `TasksComponents.kt` | Кнопка «+», inline-создание, фильтр, сортировка |
| `TasksRow` | `TasksComponents.kt` | Строка 48dp, чекбокс 16px, приоритет, дата |
| `TasksGroupHeader` | `TasksComponents.kt` | Группы по дате (Сегодня, Вчера…) |
| `TasksEmptyState` | `TasksComponents.kt` | Пустой список + «Загрузить» |
| `TasksCompletedSection` | `TasksComponents.kt` | Завершённые + удаление |
| `TaskDetailSheet` | `TasksComponents.kt` | Полноэкранная панель свойств/заметок |
| `TasksSettingsSheet` | `TasksComponents.kt` | Параметры задач |
| `TasksGrouping` | `TasksGrouping.kt` | Группировка по сроку |
Данные — CalDAV (`TasksRepository`, `CalDavClient`). Умные списки (Сегодня, На неделе) пока только в UI настроек, без отдельной серверной логики.
### Файлы (`feature/files`)
- WebDAV: список папок/файлов, навигация, загрузка.
- Office-документы через Collabora (`OfficeEditorActivity`).
---
## История версий (ключевые вехи)
| versionName | versionCode | Основные изменения |
|-------------|-------------|-------------------|
| 0.5.88 | 96 | Базовая навигация, модули |
| 0.5.890.5.90 | 9798 | Техподдержка, карточка контакта, повторный звонок |
| 0.5.910.5.92 | 99100 | Расширенный календарь, composer поддержки, фикс краша календаря |
| 0.5.100 | 108 | Меню «⋯» в почте с иконками |
| 0.5.1010.5.102 | 109110 | Вёрстка просмотра письма, swipe-to-dismiss |
| 0.5.1030.5.105 | 111113 | Фиксы крашей HTML-писем |
| 0.5.104 | 112 | Предзагрузка тел писем |
| 0.5.106 | 114 | Свайп при открытом sidebar |
| 0.5.110 | 118 | Параметры эл. почты |
| 0.5.1110.5.112 | 119120 | Запланированная отправка, меню приложений |
| **0.5.113** | **121** | **Дизайн модуля Задачи** |
Полный список версий — в git-истории `app/build.gradle`.
---
## Серверные зависимости
Приложение работает с инстансом F7cloud / Nextcloud:
| Сервис | Назначение |
|--------|------------|
| OCS API | Авторизация, настройки, Dashboard |
| WebDAV | Файлы |
| CalDAV | Календарь, задачи |
| CardDAV | Контакты |
| Mail (IMAP/SMTP через API) | Почта |
| Spreed / Talk | Конференции, записи |
| Richdocuments + Collabora | Редактирование Office |
| f7support | Техподдержка |
| Deck | Карточки |
Иконки и CSS-эталоны: `themes/forbion/` на сервере `forbion.f7cloud.ru`.
---
## Макеты и дизайн
```
design/
├── screens/ # PNG-макеты экранов (tasks, calendar, mail, …)
├── tokens/ # colors.txt, typography
├── icons/ # Локальные иконки (если нет на сервере)
└── references/ # Ссылки на Figma
```
При вёрстке ориентируемся на **мобильный CSS** веб-версии: `themes/forbion/css/pages/*-mobile.css`.
---
## Известные ограничения
1. **Задачи** — только CalDAV-календари как списки; умные списки и метки в UI есть, серверной логики нет.
2. **Заметки** — открываются в браузере, не нативно.
3. **Release-подпись** — для production нужен настроенный keystore (сейчас основная сборка — debug).
4. **Размер APK** ~130 МБ — включает vendor/talk-android и все feature-модули.
---
## Связанные документы
| Файл | Содержание |
|------|------------|
| [README.md](README.md) | Краткая справка по сборке и модулям |
| [design/README.md](design/README.md) | Структура макетов Figma |
| [vendor/talk-android/README.F7CLOUD.md](vendor/talk-android/README.F7CLOUD.md) | Форк Talk для F7cloud |
| [../docs/SERVER-PERFORMANCE.md](../docs/SERVER-PERFORMANCE.md) | Производительность сервера |
---
## Быстрый чеклист перед выдачей APK
1. `./gradlew assembleDebug` — без ошибок.
2. `versionCode` / `versionName` обновлены в `app/build.gradle`.
3. APK существует в `app/build/outputs/apk/debug/`.
4. При необходимости: `chown www-data:www-data app/build/outputs/apk/debug/*.apk`.