Files
F7cloud Mobile fd17df80a8 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).
2026-07-07 12:05:18 +03:00

318 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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`.