Умный фильтр уведомлений и звонков для Android — без root-прав
Поддержать проект можно тут: https://boosty.to/triangle_black/
Trinotify перехватывает все уведомления и входящие звонки и по каждому событию принимает решение: пропустить со звуком, показать беззвучно или заблокировать полностью.
Одни приложения будят вас звуком, другие молчат, третьи вообще не показываются — и всё это настраивается по приложению, по отправителю или отдаётся на откуп локальному классификатору, который учится на вашей собственной разметке.
Всё работает офлайн: приложение не делает ни одного сетевого запроса.
- Перехват всех уведомлений в реальном времени.
- Правила по приложению: со звуком · тихо · блокировать · решает ML.
- Правила по отправителю — по подстроке в заголовке или тексте, с необязательной привязкой к конкретному приложению.
- Блокировка несмахиваемых уведомлений — включая постоянные «демоны» сторонних приложений, которые обычно нельзя убрать.
- Зачистка уже висящих уведомлений сразу после изменения правила.
- Умное подавление повторов: обновления прогресса и служебные перепосты не звучат по второму разу.
- Медиаплееры не считаются уведомлениями — музыка, голосовые и видео не вызывают срабатываний.
- Чёрный или белый список номеров.
- Международные форматы:
+375 29 …,8 900 …,+998 …— сравнение по значащим цифрам, а не по строке. - Шаблоны вида
+7900*и короткие подстроки вида8800. - Правило «Пропускать» всегда сильнее правила «Блокировать».
- Заблокированный вызов отклоняется молча.
- Локальный архив всех уведомлений и звонков с поиском и фильтрами.
- Ручная разметка записей — она же обучающая выборка.
- Наивный Байес на устройстве: ключевой признак — приложение, плюс слова заголовка и текста. Обучение мгновенное, порог уверенности настраивается.
- Объяснимость: у каждой записи видно, какое правило сработало («Правило приложения», «ML (80%)», «По умолчанию»).
- Быстрые режимы прямо в шторке: обычный · вибро · тихий.
- Ночной режим по расписанию с ручным приоритетом до конца ночного окна.
- Свои мелодии для звонков и уведомлений, отдельные громкости.
- Объединение звуков: пачка уведомлений даёт один сигнал, а не какофонию.
- Корректный аудиофокус: чужая музыка приглушается и возвращается обратно.
- Никакой сети — данные не покидают устройство.
- Опциональное шифрование архива (SQLCipher, ключ в аппаратном Keystore).
- Опциональный вход по биометрии или пину, с защитой от съёмки экрана.
- Облачный бэкап запрещён на уровне манифеста.
- Экспорт и импорт правил и обучающей выборки в JSON.
Android не позволяет стороннему приложению отменить звук чужого уведомления: звук проигрывает система в момент публикации, раньше чем слушатель успевает среагировать. Обойти это без root невозможно.
Поэтому Trinotify использует честный компромисс:
- Включается системный режим «Не беспокоить» с политикой, при которой уведомления видны, но беззвучны.
- Все чужие уведомления таким образом замолкают.
- То, что прошло ваши правила, Trinotify озвучивает сам — собственным проигрывателем через поток будильника.
Побочный эффект — постоянная иконка «Не беспокоить» в статус-баре. Убрать её нельзя: системные индикаторы рисует SystemUI, стороннего API для них не существует.
Подробный разбор архитектуры, включая обход особенностей MIUI, устройство классификатора и модель угроз: ARCHITECTURE.md.
- Android 10 (API 29) или новее
- Root не нужен
- Около 75 МБ свободного места (в APK входят встроенные мелодии и нативные библиотеки шифрования)
- Скачайте APK со страницы Releases.
- Разрешите установку из неизвестных источников.
- Установите и откройте приложение.
Откройте Настройки → Разрешения внутри приложения — там показан статус каждого доступа и кнопка выдачи:
| Разрешение | Зачем нужно |
|---|---|
| Доступ к уведомлениям | чтение и удаление уведомлений — основа работы |
| Управление «Не беспокоить» | системное глушение чужих звуков |
| Роль «Определитель номера» | фильтрация входящих звонков |
| Состояние телефона | собственный рингтон при входящем вызове |
| Батарея без ограничений | чтобы система не выгружала сервис |
Владельцам Xiaomi/MIUI: дополнительно включите «Автозапуск» для Trinotify в системных настройках приложений — иначе оболочка будет выгружать фоновый сервис.
- Включите «Режим тишины» (Настройки → Основное) — это включит системное «Не беспокоить».
- Выберите «Действие по умолчанию»: что делать с приложениями без правил.
- На вкладке «Приложения» назначьте правила важным приложениям.
- Через несколько часов работы откройте «Архив», разметьте десяток записей и нажмите «Переобучить модель», если хотите использовать ML.
- JDK 17
- Android SDK (compileSdk 34, build-tools 34+)
- Gradle 8.7+ (или Android Studio)
git clone <адрес-репозитория>
cd Trinotify
# Путь к вашему Android SDK
echo "sdk.dir=/путь/к/Android/Sdk" > local.properties
# Отладочная сборка
gradle assembleDebug
# Юнит-тесты (24 теста)
gradle testDebugUnitTestГотовый APK окажется в app/build/outputs/apk/debug/.
# Создайте своё хранилище ключей
keytool -genkeypair -v -keystore trinotify.keystore -alias trinotify \
-keyalg RSA -keysize 2048 -validity 10000
# Пропишите пароли
cp keystore.properties.example keystore.properties
# затем отредактируйте keystore.properties
gradle assembleReleaseФайлы keystore.properties, *.keystore и local.properties внесены в
.gitignore и никогда не должны попадать в репозиторий. Если файла подписи
нет, сборка всё равно пройдёт — APK просто останется неподписанным.
app/src/main/java/com/trinotify/app/
├── data/ Room-сущности, DAO, база, настройки, хранилище ключа
├── logic/ Движок правил, кэш, режимы, экспорт/импорт
├── ml/ Наивный Байес: чистая математика + обёртка модели
├── service/ Перехватчик уведомлений, фильтр звонков, звук, DND
└── ui/ Экраны Jetpack Compose
Около 3900 строк Kotlin в основном коде и 271 строка тестов. Полная карта модулей — в ARCHITECTURE.md.
Приложение по своей природе видит очень чувствительные данные: переписку, коды подтверждения, номера звонящих. Поэтому:
- нет ни одного сетевого вызова — ни аналитики, ни телеметрии;
- архив исключён из облачного бэкапа (
allowBackup="false"и явные правила извлечения данных); - шифрование базы — опция: SQLCipher, ключ в аппаратном Android Keystore, неизвлекаемый даже при доступе к файлам;
- вход в интерфейс можно закрыть биометрией или пином, при этом окно
помечается
FLAG_SECURE(нет превью в «Недавних» и скриншотов); - экспортируемый JSON не шифруется — он содержит тексты уведомлений, храните его осознанно.
Известное ограничение: при включённом шифровании после перезагрузки телефона и до первой разблокировки экрана база недоступна — в это окно фильтрация работает по действию по умолчанию, без записи в архив.
Честный список того, чего приложение не может:
- Иконки статус-бара (луна «Не беспокоить») убрать невозможно — это система.
- Звонки от контактов Android не передаёт в фильтр, они проходят всегда.
- Экстренные вызовы не фильтруются — и не должны.
- Правило отправителя без указания приложения может сработать на чужое уведомление с таким же заголовком; интерфейс об этом предупреждает.
- Уведомление блокируется после появления, а не до — иначе на Android нельзя.
| Black Triangle | автор идеи, постановка задач, тестирование, владелец репозитория |
| Claude (Anthropic) | реализация кода, архитектура, документация |
Подробнее — CONTRIBUTORS.md.
Trinotify распространяется на условиях GNU General Public License v3.0 — см. файл LICENSE.
Copyright (C) 2026 Black Triangle
Это свободная программа: вы можете распространять её и/или изменять на условиях
GNU General Public License, опубликованной Фондом свободного программного
обеспечения, либо версии 3, либо (по вашему выбору) любой более поздней версии.
Эта программа распространяется в надежде, что она будет полезной, но БЕЗ
КАКИХ-ЛИБО ГАРАНТИЙ. Подробности см. в GNU General Public License.
Встроенные звуковые файлы являются собственностью их правообладателей и включены исключительно для личного использования.