Commit Graph

117 Commits

Author SHA1 Message Date
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 d9cacb8c9c build: debug — все ABI (x86 для BlueStacks/эмуляторов), release — ARM-only
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled
ABI задаются побилдтипово: debug включает x86/x86_64 → нативно на эмуляторах
(BlueStacks) и на ARM-девайсах для тестирования; release остаётся arm64+armeabi-v7a
(компактный прод). Проверено: debug-APK содержит все 4 ABI.
2026-07-07 22:50:49 +00:00
b-dev-mobile f0708a30ac Этап 1: CI (Gitea Actions) + GPL corresponding source (п.4c)
CI / verify (push) Has been cancelled
CI / release (push) Has been cancelled
- .gitea/workflows/ci.yml: push/PR → testDebugUnitTest+lintRelease+assembleDebug;
  тег v* → подписанный assembleRelease + архив исходников в Gitea Release.
  Gitea 1.26.1 поддерживает Actions. Self-hosted раннер (метка f7-android),
  т.к. проект тяжёлый (WebRTC) и нужен тёплый Gradle-кэш.
- scripts/package-source.sh: GPL corresponding source (§6) — архив всего дерева
  вкл. vendor talk-android (GPL), LICENSE, NOTICE. Проверен: 6.7 МБ, 2353 файла.
  Закрывает п.4c, работает и вручную до появления раннера.
- docs/CI.md: пайплайн, регистрация раннера, secrets.

НЕ активно до регистрации раннера на инфре B (нужен Gitea-админ для токена).
2026-07-07 22:32:38 +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 6abb1b15c3 Этап 0 п.4b (GPL): восстановлены копирайты Nextcloud в vendor (сверка с апстримом v23.0.0)
102 файла: искажённые email реальных разработчиков Nextcloud (Julius Linus,
Tobias Kaminsky, Álvaro Brey — были @f7cloud.com) восстановлены на настоящие;
холдер 'F7cloud'/'F7cloud and F7cloud contributors' -> 'Nextcloud GmbH and
Nextcloud contributors'. Название продукта в заголовках оставлено 'F7cloud Talk'
(ребренд форка — требование trademark-политики Nextcloud). Менялись только строки
копирайта в комментариях, код не тронут. Снимает нарушение GPLv3 §4 (атрибуция).

Проверено сборкой: assembleRelease -> BUILD SUCCESSFUL, APK 53 МБ.
2026-07-07 20:29:00 +00:00
b-dev-mobile 3aebb5c68b Этап 0 п.4a (GPL): LICENSE (GPL-3.0-or-later) в корень + раздел лицензии в README
Приложение линкует vendored Nextcloud Talk (GPL-3.0-or-later), поэтому весь APK —
производная работа под GPL. Восстановление затёртых копирайтов Nextcloud в vendor
(п.4b) — отдельно, точной сверкой с апстримом talk-android v23.0.0.
2026-07-07 20:06:17 +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 c259936e82 Этап 0 п.2: универсальный APK 99→53 МБ (abiFilters ARM + resConfigs ru,en)
- defaultConfig.ndk.abiFilters 'arm64-v8a','armeabi-v7a' — без эмуляторных x86/x86_64
- resourceConfigurations += ['ru','en'] — срез ~48 локалей vendor до нужных
- проверено сборкой: assembleRelease 53 МБ, ABI только ARM, подпись v2+v3 OK
- renderscriptSupportModeEnabled в vendor НЕ трогал (риск blur, отдельный пункт)
2026-07-07 17:55:14 +00:00
b-dev-mobile 67cc851b15 Этап 0 п.1: release собираем и подписан (signingConfig из env + R8-правила)
- signingConfig.release читает F7_KEYSTORE_FILE/PASSWORD, F7_KEY_ALIAS/PASSWORD
  из env или -P; фолбэк на debug-подпись если не заданы. Схемы v2+v3.
- R8: app/proguard-rules.pro (kotlinx.serialization, Firebase, JS-мосты, Coil);
  vendor consumer-rules.pro через consumerProguardFiles (WebRTC/LoganSquare/Dagger/
  RxJava/Parceler/EventBus + dontwarn geogson/joda из missing_rules.txt).
- Проверено на инфре B (JDK 21 + Android SDK 36): assembleRelease BUILD SUCCESSFUL,
  подписанный APK 99 МБ (было ~130 debug), apksigner verify v2+v3 OK.
- Доки: docs/RELEASE-SIGNING.md, docs/AUDIT-2026-07-07.md.
2026-07-07 13:17:20 +00:00
b-dev-mobile 1641ad8ab8 docs: полный аудит приложения 2026-07-07 (6 направлений, с file:line) 2026-07-07 11:27:33 +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
b-dev-mobile 1affb66874 Онбординг в федерацию F7: INTEGRATION.md + CHANGELOG.md (роль b-dev-mobile, ячейка B) 2026-07-07 09:36:51 +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