Commit Graph

46 Commits

Author SHA1 Message Date
b-mob-notify 2854f5d5a4 test(designsystem): Roborazzi-эталон F7NotificationRow (Fd, w360dp) — состояния с действиями/без; PNG-эталон нативной строки уведомления 2026-07-13 10:28:02 +00:00
b-dev-mobile a30627a07d notifications P1: лента с действиями + «Скрыть все»
- NotificationsRepository: парс actions[] (label/link/type/primary),
  dismissAll (DELETE /api/v2/notifications), executeAction (GET/POST/PUT/DELETE по action.link)
- F7NotificationRow: FlowRow кнопок-действий (primary=заливка, прочие=контур)
- NotificationsSheet: заголовок «Уведомления» + «Скрыть все», проброс действий,
  оптимистичное скрытие после действия/скрыть-все

Контракты сверены с исходником notifications на forbion (deleteAllNotifications, actionToArray).
2026-07-13 10:11:32 +00:00
b-mob-notify cc7ad71d41 push(core): F7PushRegistrar.unregisterBlocking — снятие устройства f7push при logout (DELETE devices/{id}, контракт mail/110); compile+detekt green 2026-07-13 10:06:03 +00:00
b-mob-notify a6bda894b0 push(core): P2 retry/бэкофф регистрации устройства (транзиентные сбои/5xx/408/429) + фикс detekt ArgumentListWrapping в F7IncomingCallQueue 2026-07-13 09:28:30 +00:00
b-dev-mobile 1acc604bd5 test(designsystem): Roborazzi render 360dp (Figma-фрейм), не 390 — эталон пересnят 2026-07-13 09:22:06 +00:00
b-dev-mobile 333026143b test(designsystem): Roborazzi screenshot-каркас — рендер Compose в PNG на JVM (Fd-сверка без эмулятора)
Пилот: F7PrimaryButton/F7SecondaryButton рендерятся в PNG (390dp xxhdpi) через
Robolectric+Roborazzi, recordRoborazziDebug зелёный. Основа автономного Fd-прохода:
экран → PNG → сравнение с веб-мобильной forbion. Роли добавляют тесты на свои экраны.
2026-07-13 09:19:32 +00:00
b-mob-contacts a8741e982c feat(contacts): P2 шаг1 — типы TEL/EMAIL (парсинг из raw, подписи в карточке, сохранение при правке) +4 теста 2026-07-13 08:57:34 +00:00
b-dev-mobile e6570c008e chore(core:network): refresh detekt-baseline — амнистия смеллов из пакета v0.5.144 (CalDavClient free-busy/shares, NextcloudWebSession); мой легаси-долг, не calendar/contacts 2026-07-13 08:06:41 +00:00
b-mob-contacts 6b98c5a0ba feat(contacts): P1 шаг 2/2 — правка/удаление в UI (Room v4→5 href/etag/raw, форма, delete-подтверждение) 2026-07-13 07:59:00 +00:00
b-mob-contacts bc1a4970ef feat(contacts): ядро P1 — updateContact/deleteContact (If-Match) + VCardEditor round-trip + 10 юнит-тестов 2026-07-13 07:34:11 +00:00
b-dev-mobile 2cb7a9a470 feat(core/network): DTSTART (startRaw) в DavTask — для умных списков Tasks (запрос b-mob-tasks mail/080) 2026-07-12 22:32:13 +00:00
b-dev-mobile e6a71de7a6 feat(calendar): пакет функционала — событие 1:1 с веб, вложения, повторение, шаринг, free/busy
- Русские месяцы в шапке; нативный DatePickerDialog (material3 крашился)
- 403 при PUT события: учёт supported-calendar-component-set (VTODO-коллекции
  не принимают VEVENT) + sabre-precondition в тексте ошибки
- Окно события по _calendar-edit-full-fields.css: pill-поля, крестик, зелёная
  галочка-сохранение, нативные пикеры даты/времени, высота 94% экрана
- Talk-беседа к событию: выбор существующей / создание публичной|приватной
- Вложения (ATTACH+FILENAME/FMTTYPE): «из файлов» (WebDAV-пикер) или загрузка
  с устройства в /Calendar; round-trip при редактировании события
- Кастомное повторение (_calendar-repeat-modal.css): интервал+частота, дни
  недели кружками, окончание никогда/до даты/N раз ↔ RRULE (parse/build/описание)
- Многодневные события (endDate) и несколько напоминаний (VALARM list)
- Управление календарём (✎ в сайдбаре): PROPPATCH имя/цвет, DELETE,
  шаринг через DAV oc:invite + OCS sharees (польз./группы, чтение/редакт.)
- Discard-диалог при закрытии редактора с несохранёнными изменениями
- Занятость участников: iTIP VFREEBUSY через DAV outbox, конфликты красным
2026-07-10 22:28:15 +00:00
b-dev-mobile 4b000d3b27 feat(files): веб-сессия Nextcloud для .whiteboard в WebView
Доска (whiteboard) открывается через веб-viewer, которому мало Basic-auth:
Vue-XHR ходят по session-cookie+CSRF. Теперь перед загрузкой web-файла
логинимся формой /login app-паролем (NextcloudWebSession, обходит 2FA),
переносим cookie в CookieManager и грузим страницу нативно — для web-файлов
отключено OkHttp-проксирование (оно теряло тело POST/PROPFIND → «нет файлов»).
Collabora-путь не тронут (WOPI-токен самодостаточен).
+NetworkFactory.newBaseBuilder — билдер на общем пуле без auth.
2026-07-10 22:26:38 +00:00
b-dev-mobile e1e0427066 fix: иконки шторки в единой круглой рамке; кэш Задач для быстрого показа
- Шторка: КАЖДАЯ иконка теперь в белом круге с рамкой и мягкой тенью,
  все одного размера (глиф внутри 56% рамки) — как на мобильном сайте
  (было: плоские глифы без рамки, разного размера).
- Задачи грузятся быстрее: TasksCache (в памяти на время процесса) —
  списки и задачи по спискам показываются мгновенно из кэша при
  повторном открытии раздела/списка, сеть обновляет в фоне. Гонки
  учтены: результат применяется, только если пользователь ещё на этом
  списке.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:52:01 +00:00
b-dev-mobile c9340ab2ab feat(tasks): вложенные задачи (подзадачи) + per-task меню «⋯»
Паритет веб-версии Задач:
- CalDAV: RELATED-TO;RELTYPE=PARENT в модели/парсере/билдере VTODO
  (DavTask.parentUid); createTask принимает parentUid; updateTask и
  toggleComplete сохраняют связь с родителем.
- TasksRepository/VM: createSubtask(parent), deleteTask(task) для любой
  задачи (не только открытой детали).
- UI: у задачи меню «⋯» → «Добавить вложенную задачу» / «Удалить задачу»;
  подзадачи рисуются под родителем с отступом 24dp; диалог ввода названия
  подзадачи. Подзадачи исключены из верхнего уровня (не дублируются).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:32:19 +00:00
b-dev-mobile 47b2638b2b fix(menu): состав шторки 1:1 (Поддержка + Личный кабинет) + иконки внешних сайтов
По разметке сайта (layout.user.php):
- Добавлены пункты «Поддержка» (AppTab.Support, icon-header-f7support)
  после Заметок и «Личный кабинет» (открывает нативную ProfileSheet,
  lk-header-icon) перед Уведомлениями — их не хватало.
- Иконки внешних сайтов (Bitrix/1C) строились из имени файла как есть →
  битая ссылка → глобус. Теперь путь /index.php/apps/external/img/{icon},
  как на сайте.
- Coil: добавлен Basic-auth интерсептор для хоста сервера — серверные
  картинки (иконки external и пр.) требуют логина, без него был 401.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 07:13:56 +00:00
b-dev-mobile fd341cb22a fix: нижняя панель 1:1 с сайтом (Задачи + mobile-иконки); Deck открывается устойчиво
Нижняя панель (по layout.user.php сайта): средняя кнопка = ЗАДАЧИ
(была Карточки) — по решению владельца «как на сайте»; иконки из
набора mobile-*-icon (плоский конверт mobile-mail-icon вместо
конверта-с-@, mobile-tasks-icon, mobile-spreed-icon вебкамера,
mobile-burger-icon), локально/офлайн; размеры 25dp (app-link) как
на сайте, стрелка «назад» 18dp. Карточки остаются в шторке-меню.

Deck: loadBoardDetail больше не рушится, если GET /boards/{id}
(метки/права) не отвечает — стеки грузятся всё равно (вероятная
причина «доска не открывается» на устройстве). Заголовок/метки/права
подставляются best-effort.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 06:43:56 +00:00
b-dev-mobile cac214340e fix(menu): плоские иконки шторки как на мобильном сайте (images/menu, не glass)
Шторка показывала glass-кружки (frosted 49px из images/header/*-glass),
а мобильный сайт рисует ПЛОСКИЕ двухцветные иконки из images/menu/*.svg
(зелёный #70B62B + чёрный контур). Забандлил menu-*.svg (files/calendar/
contacts/cards/notes/settings + notifications из not-menu-icon-big),
переключил пункты приложений и нативные Уведомления/Настройки на них.
Неиспользуемые glass/header-ассеты удалены (нижняя панель грузит иконки
с сервера).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 05:58:00 +00:00
b-dev-mobile 7f95b07666 design(menu): шторка и нижняя панель 1:1 по живому forbion
Косяк: оба меню расходились с боевым forbion (_header.css).
Шторка (.app-menu--mobile): убраны скругление верха и ручка-хендл
(в живом их нет), высота — по контенту почти на весь экран (была
½ экрана), нижний отступ 90 под панель, сетка 3 кол. с gap 8 (было 20),
фон #FBFBFB. Иконки-glass теперь ЛОКАЛЬНЫЕ (assets/menu/, офлайн);
Уведомления/Настройки — фирменные mobile-*-glass вместо Material-иконок
в круге.
Нижняя панель (.header__mobile-bottom): фикс. пилюля 328×61, паддинг 3,
кнопки 55 с фоном #FBFBFB и рамкой #E6E6E6 (была градиентная), раскладка
space-between; ВОЗВРАЩЕНА подсветка активного — текущий раздел и открытый
бургер красятся полупрозрачным зелёным градиентом 104° (как в forbion).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 05:22:23 +00:00
b-dev-mobile e5bbf0e123 design: семантика ошибок по боевой теме forbion
Живой мобильный CSS сервера (themes/forbion, _base.css) — теперь источник
истины (решение владельца «копировать один в один»): Error #D74642,
ErrorText #D42722, ErrorBg #FFE2E2. Базовый Red #FF7A66 брендбука
сохранён для тегов.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 18:45:12 +00:00
b-dev-mobile dd5bdbc177 push: 30-с таймаут входящего звонка + уведомление «Пропущенный звонок»
Не отвеченный звонок звонит 30 секунд, после чего снимается сам:
рингтон/уведомление гасятся, показывается «Пропущенный звонок»
(на локскрине — обезличенно, после разблокировки — с названием
комнаты; тап открывает комнату). Полноэкранный входящий закрывается
по тому же событию. Страховочный alarm поднимает процесс и снимает
звонок, даже если система убила приложение во время звонка.
Принятые/отклонённые звонки «Пропущенный» не показывают.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-09 17:47:53 +00:00
b-dev-mobile a674721353 ux: единый экран ошибки F7ErrorState + retry (Этап 2 п.12)
Новый F7ErrorState: центрированная иконка + сообщение + «Повторить»
вместо россыпи красного текста. F7ModuleScreen при ошибке без данных
показывает его (+ новый onErrorRetry — retry без хедер-кнопки ↻).
Подключено: Контакты/Конференции/Карточки/Поддержка (через F7ModuleScreen),
Файлы (onErrorRetry=refreshCurrent), Почта (пустой список + ошибка →
F7ErrorState, убран верхний баннер-текст). Retry везде дергает load/refresh.
2026-07-09 14:08:36 +00:00
b-dev-mobile fb57156ee9 calendar: кэш событий по CTag (Этап 2, DAV ч.2)
listCalendars теперь забирает и cs:getctag (тот же PROPFIND — ноль лишних
запросов; DavCalendar.ctag). Новый CalendarEventsCache — дисковый кэш
СЫРЫХ REPORT-ответов per (аккаунт, календарь, диапазон), ключ — CTag:
не менялся → события парсятся с диска (боевым парсером CalDavClient),
REPORT-запросы в сеть не идут. Изменился → сеть + обновление кэша.
Хранение сырого XML вместо сериализации моделей — без хрупкого
JSON-маппинга ~20 полей события; чистка записей старше 30 дней.
CalDavClient.queryEventsInRange разделён на queryEventsRawXml +
parseEventsXml (поведение прежнее). Эффект: переключение месяцев,
периодический рефреш и возврат в календарь при неизменных календарях —
1 PROPFIND вместо 1+N REPORT. +5 unit-тестов кэша (JVM, TemporaryFolder).
2026-07-09 09:39:07 +00:00
b-dev-mobile 00daa980a8 contacts: инкрементальная синхронизация по CTag (Этап 2, DAV)
CardDavClient.collectionSignature() — дешёвый PROPFIND depth:1 за CTag книг
(расширение CalendarServer, Nextcloud; фолбэк sync-token), без address-data.
ContactsRepository.syncContacts: перед полной закачкой всех vCard сверяет
подпись коллекций; не менялось → отдаём кэш (Room), не качаем. Ускоряет
pull-to-refresh (раньше — полный PROPFIND ~500 vCard каждый раз).
+4 unit-теста на parseCollectionSignature (regex-парсер, без Android XmlPull).
2026-07-09 06:44:49 +00:00
b-dev-mobile cfa9fe2ffd security: FLAG_SECURE на экранах входа и PIN (аудит п.3)
Новый эффект F7SecureScreen(): пока экран на виду — окно с FLAG_SECURE
(нет в скриншотах/recents/записи экрана), снимается при уходе. Повешен на
LoginScreen (ввод пароля), AppLockUnlockScreen (разблокировка PIN) и
AppLockSetupDialog (создание PIN). Закрывает хвост Этапа 0 п.3.
2026-07-09 02:50:57 +00:00
b-dev-mobile 342e1e497d ui: убрана кнопка «чаты» в панели и кнопка обновления в Конференциях
- Нижняя панель: слева всегда «назад» (кнопки чатов больше нет; в
  Конференциях раньше был чат-слот) — единый layout во всех разделах.
- Экран Конференций: убран onRefresh у F7ModuleScreen → нет кнопки ↻
  сверху справа (список грузится при открытии и по push).
2026-07-08 17:45:34 +00:00
b-dev-mobile fe330be510 bottombar: убрана зелёная подложка под активной кнопкой
Фон кнопок всегда нейтральный (0x99FFFFFF); убраны highlight-подложка,
BottomBarHighlightBrush и параметр highlighted слота. Зелёные варианты
иконок чатов/бургера (при открытии) — это иконка, остаются.
2026-07-08 17:39:14 +00:00
b-dev-mobile 58eed74b03 bottombar: иконки-разделы крупнее (46dp) — заполняют кружок
У серверных SVG (mail-/deck-/spreed-header-icon) внутренний «воздух»,
поэтому глиф оставался мелким. Отдельный размер BottomBarSectionIconSize=46dp
для Почты/Карточек/Конференций (стрелка/бургер — прежние 34dp).
2026-07-08 17:32:38 +00:00
b-dev-mobile d50eaaed3d bottombar: крупнее иконки в кружках (24dp → 34dp)
Иконки заполняли кружок только на ~44% — увеличены, чтобы «на весь кружок».
2026-07-08 16:32:48 +00:00
b-dev-mobile 89e32d2875 bottombar: навигационная панель по дизайну «Новое меню»
Панель стала единой навигационной: слева назад (в Конференциях — чаты),
далее ярлыки-разделы Почта · Карточки · Конференции (активный подсвечен),
справа выдвижное меню. Профиль/Уведомления/Настройки/Создать убраны из
панели (Профиль/Уведомления/Настройки — в выдвижном меню; бейдж
уведомлений перенесён на кнопку меню).

Создание раньше вызывалось ТОЛЬКО из панели → чтобы не потерять:
- новый общий компонент F7CreateButton (зелёный круг «+»);
- добавлен в шапку Файлов (→ меню создания) и Контактов (→ добавить контакт).
Задачи/Поддержка уже имели свои кнопки; Почта — «+» в шапке.

F7BottomBarConfig упрощён (единый layout), F7MobileBottomBar получил
слоты SectionMail/SectionCards/SectionConferences + activeTabKey.
2026-07-08 15:26:24 +00:00
b-dev-mobile a30af98a8d menu: состав пунктов точно по дизайну (+Уведомления/Настройки)
По дизайну выдвижного меню: Файлы/Календарь/Контакты/Карточки/Заметки +
Bitrix/1C/Личный кабинет + Уведомления/Настройки. Убраны Почта/Конференции/
Задачи/Поддержка (остаются в нижней панели).
- F7AppMenuItem: опц. localIcon (ImageVector); нативные пункты рисуются в
  круглом бейдже с зелёной обводкой (стиль glass) вместо серверной SVG;
- Уведомления → NotificationsSheet, Настройки → настройки активного таба,
  обработка по label в AppScaffold.onItemClick.
2026-07-08 13:18:45 +00:00
b-dev-mobile fda34a5b69 menu: сетка 3 колонки + подпись во всю ширину ячейки (по дизайну)
Дизайн выдвижного меню — 3 колонки (было 4), иконки-бейджи *-glass.svg
уже совпадают со стилем. Ячейка стала кликабельной целиком (clip+ripple),
подпись использует ширину ячейки (Личный кабинет/Уведомления не дробятся).
2026-07-08 12:56:17 +00:00
b-dev-mobile 04f67e071b ui: контент не залезает под системную навигацию (нижний inset)
Edge-to-edge (targetSdk 36): контент был full-bleed без нижнего inset →
уезжал под системные 3 кнопки/жест-панель (плавающая нижняя панель свой
navigationBarsPadding имела, а контент — нет). Добавил f7SafeBottomInsets
к контенту в F7AppScaffold (верх уже был через f7SafeTopInsets).
2026-07-08 12:25:43 +00:00
b-dev-mobile 530663754a menu: лончер приложений → bottom-sheet на пол-экрана (v0.5.116/124)
F7AppMenuSheet был fillMaxSize с непрозрачным фоном (закрывал весь экран).
Теперь выезжает снизу и занимает ~пол-экрана: якорь BottomCenter,
fillMaxHeight(0.6f), скруглённый верх 20dp + тень, ручка-хендл, лёгкий
скрим над листом (тап закрывает), зазор под нижнюю панель, сетка иконок
скроллится. Экран под меню виден сверху. Бамп версии 0.5.115→0.5.116.
2026-07-08 12:14:36 +00:00
b-dev-mobile 483e4107d7 Дизайн-палитра из Figma в F7Colors + фикс Error-красного
CI / verify (push) Failing after 3s
CI / release (push) Has been skipped
- Точные Base-токены из «Брендбука» владельца: Black #151515, Grey1/2/3
  #808080/#F5F5F5/#E6E6E6, Green #70B62B (+30/10%), Yellow #F6E120,
  Purple #9747FF, Red #FF7A66 (+10%).
- Семантика (TextPrimary/Secondary/Border/SurfaceMuted/Primary) на Base — совпала.
- ИСПРАВЛЕНО: Error #D74642 → #FF7A66 (дизайн-красный) — app-wide на кнопках
  удаления/ошибках. Yellow/Purple под теги.

designsystem компилируется. Шаг к закрытию долга «77 захардкоженных Color()».
2026-07-08 09:05:26 +00:00
b-dev-mobile 312537cd8a Трек дизайна: токены-фундамент (F7Spacing/F7Radius) + карта Figma
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled
- Снятие токенов из Figma роли design (ocVUCYCrfFUoqYYvlcLPBF): цвета сверены —
  совпадают с F7Colors; типографика Raleway 14/18/20/24 (база в F7Typography есть).
- F7Spacing (4dp-сетка) + F7Radius — закрывают аудитный пробел «нет spacing-токенов».
- docs/DESIGN-SOURCE.md: карта страниц/секций Figma, доступ по API, процесс
  попиксельной вёрстки, заметка про rate-limit (точечные node-запросы).

Источник — Figma (боевой forbion не трогаю). Координация mail/044. designsystem компилируется.
2026-07-08 00:56:43 +00:00
b-dev-mobile fd96ca89e6 Этап 1: version catalog (libs.versions.toml) — устранён дрейф версий
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled
- gradle/libs.versions.toml: единый источник версий (Gradle 9.3 авто-подхват).
- 15 module build.gradle мигрированы на libs.* (скриптом, регекс по group:name).
- Устранён дрейф: coroutines 1.8.1/1.10.1→1.10.1, coil 2.6.0/2.7.0→2.7.0,
  lifecycle 2.8.1/2.8.7→2.8.7, activity-compose 1.9.0/1.10.1→1.10.1,
  core-ktx 1.13.1/1.15.0→1.15.0. Firebase в core/push → bom (был explicit 24.0.1).
- Compose BOM в каталоге вместо дубля в каждом модуле.

Проверено: assembleRelease BUILD SUCCESSFUL, APK 53 МБ.
2026-07-07 23:53:30 +00:00
b-dev-mobile ac438269c5 Этап 1: detekt (статанализ + ktlint-форматирование) с baseline
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled
- detekt 1.23.8 применён ко всем НАШИМ модулям (vendor-форк исключён),
  +formatting-ruleset (обёртка ktlint). Совместим с Kotlin 2.3 (проверено).
- config/detekt/detekt.yml — настройки под наш код (LongMethod 120, MaxLine 140,
  MagicNumber off — dp/цвета отдельно, FunctionNaming off — @Composable Заглавные).
- detekt-baseline.xml по модулям: ~403 текущих замечаний зафиксированы →
  detekt зелёный, дальше ловит только НОВЫЕ. detekt в CI (ci.yml verify).

Проверено: detektBaseline + detekt BUILD SUCCESSFUL.
2026-07-07 23:36:40 +00:00
b-dev-mobile ab8fa70e51 Этап 1: единый OkHttpClient ч.2 — 401 централизован через interceptor
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled
- UnauthorizedInterceptor (401→UnauthorizedException) в NetworkFactory,
  флаг throwOnUnauthorized (по умолчанию true).
- Удалены 75 ручных проверок if(code==401) throw в 16 репозиториях.
- AuthVerifier (login-верификация) исключён: throwOnUnauthorized=false —
  401 = 'неверный пароль' со своим сообщением, не session-expired.
- Побочно: 401 теперь ловится единообразно ВЕЗДЕ (включая пути, что раньше
  забывали проверку).
- +3 MockWebServer-теста (401 бросает; 200/403 проходят) — всего 18 тестов.

Проверено: 18 тестов зелёные + assembleRelease BUILD SUCCESSFUL, APK 53 МБ.
2026-07-07 23:29:49 +00:00
b-dev-mobile c45ebd8d49 Этап 1: единый OkHttpClient (переиспользование пула/кэша) — ч.1
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled
Раньше NetworkFactory создавал новый OkHttpClient на КАЖДЫЙ запрос (~32 места):
TLS-handshake + новый пул/диспатчер на запрос + утечка ExecutorService.
Теперь: один базовый клиент (общий ConnectionPool/Dispatcher + диск-кэш 20МБ),
авторизованные варианты через base.newBuilder() (шарят пул/кэш), кэшируются по
кредам+таймаутам. Публичный API НЕ менялся — 32 вызова не тронуты.
Init диск-кэша в F7MobileApp.onCreate.

+3 unit-теста (переиспользование клиента, общий пул). 401→interceptor НЕ делал
(меняет семантику исключений — отдельный шаг).

Проверено: 15 тестов зелёные + assembleRelease BUILD SUCCESSFUL, APK 53 МБ.
2026-07-07 23:14:20 +00:00
b-dev-mobile b90107a7fc Этап 1: баги данных (test-first) — ICS-парсер, QR-пароль, курсор почты
Заведена тестовая инфраструктура (core:network junit) + 12 unit-тестов. Починено:
- ICS parseIcsInstant: суффикс Z → UTC (был локальным!), TZID учитывается, floating→локаль
- parseProps сохраняет параметры: несколько ATTENDEE не схлопываются, CN/PARTSTAT/ROLE
  читаются (была порча участников при редактировании события → PUT на сервер)
- unescape single-pass (последовательные replace ломались на экранированном бэкслеше)
- CalDavClient.parseIcsInstant делегирует в CalendarIcs — устранён рассинхрон календарь↔задачи
- LoginFlowClient: маркер-парсер вместо split('&') — QR-пароль с &/: не теряется
- MailRepository/ViewModel/Models/Cache/Screen: курсор пагинации Int→Long (обрезка ~2038)

Проверено: 12 тестов зелёные (CalendarIcsTest 8 + LoginFlowClientTest 4) + assembleRelease OK.
2026-07-07 22:21:37 +00:00
b-dev-mobile cef526e778 Этап 0 п.5 (gradle-гигиена): parallel=true + удалены мёртвые модули
- org.gradle.parallel=true (быстрее сборка 20 модулей)
- удалены core:data, core:ui (пустые заготовки) и feature:widgets (не в
  settings.gradle, не компилировался) + чистка settings.gradle
- nonTransitiveRClass=true и убирание enableJetifier ОТКАЧЕНЫ: vendor-форк
  talk-android их не переживает (R транзитивно; legacy android.support.* в
  зависимостях типа FlexibleAdapter). Причины — в комментах gradle.properties.

Проверено сборкой: assembleRelease BUILD SUCCESSFUL. Этап 0 закрыт.
2026-07-07 21:47:49 +00:00
b-dev-mobile 5eb6efb36b Приватные уведомления на локскрине + откат биопривязки (требование владельца: звонки/push при блокировке)
Владелец: входящие звонки и push должны работать при заблокированном телефоне.
- Биопривязка app password ОТКЛОНЕНА (вариант А): блокировала приём звонка без
  разблокировки. Откачена из main (сохранена на ветке wip/biometric-binding).
  Пароль остаётся под Keystore AES-256-GCM (п.3) — работает в фоне.
- Приватность локскрина: сообщения и звонки → VISIBILITY_PRIVATE + generic
  public-версия ('Новое сообщение'/'Входящий звонок'); канал lockscreenVisibility=PRIVATE.
  Полный контент — после разблокировки. Push приходит plaintext, для показа/звонка
  пароль не нужен → звонки звонят и пуши приходят при блокировке.

Проверено сборкой: assembleRelease BUILD SUCCESSFUL, APK 53 МБ.
2026-07-07 21:22:24 +00:00
b-dev-mobile 51fd1bf936 Этап 0 п.3: безопасность-минимум (trust-all off в release, шифрование пароля, allowBackup, ревокация)
1. trust-all TLS отключён в release: гейт if(!BuildConfig.DEBUG) в UnsafeSsl +
   OfficeWebViewClient + TalkCallActivity; чекбокс скрыт в release. buildConfig
   включён в core:network и feature:talk.
2. allowBackup=false (tools:replace поверх vendor true).
3. app password шифруется в покое AndroidKeystore AES-256-GCM (KeystoreCrypto),
   AuthStore мигрирует legacy-plaintext при первом load. Биометрия — отдельная
   задача (ломает фоновые push/звонки, нужен кэш в памяти).
4. Ревокация app password при logout (AppPasswordRevoker, DELETE core/apppassword,
   best-effort).

Проверено: assembleRelease 53 МБ, подпись v2+v3, allowBackup=false в манифесте OK.
2026-07-07 19:51:23 +00:00
b-dev-mobile 6a07f1f40a v0.5.114: убраны зашитые касания боевых хостов ячейки A (mail/035)
- дефолт-URL экрана входа -> BuildConfig.DEFAULT_SERVER_URL (-Pf7DefaultServerUrl, по умолчанию пусто)
- TalkHelper: preconnect только к origin сессии, хардкод hpb-prod.f7cloud.ru удалён
- AuthErrors: нейтральный пример адреса сервера
2026-07-07 10:04:11 +00:00
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