Dynamic Island в стиле iPhone над камерой любого Android-смартфона
Уведомления с ответом · навигатор · оплата · музыка с текстом песен · звонки · таймеры · загрузки · зарядка · фонарик · системные события
Что нового · Возможности · Установка · Жесты · Настройки · Как устроено
- 🫧 Liquid Glass: обновлённые блики и прозрачность, настройка плотности и силы системного размытия. Эффект распространяется на остров, раскрытые карточки и вторую активность на поддерживаемых устройствах.
- 📌 Приложения и контакты: компактный ряд быстрого доступа под датой.
- 🕒 Сводка: часы, шаги и погода на отдельных компактных страницах; варианты часов и дополнительные элементы управления.
- 🌤 Погода: выбор города, отдельная карточка или страница сводки, ручное обновление и повтор после ошибки.
- 🎵 Текст песен: мягкая непрерывная волна подсветки и плавная смена строк; обычный текст остаётся прокручиваемым.
- 🎨 Свои цвета и шрифты: цвет текста, HEX/HSV-палитра, системный или собственный шрифт, толщина и размеры элементов.
- 📶 Точка доступа: постоянное состояние, переход к настройкам и количество клиентов, когда система предоставляет достоверные сведения.
- ⬇️ Скорость загрузки в раскрытой карточке: данные приложения или необязательная приблизительная общая скорость сети ↓/↑; проценты загрузки сохраняются.
- 🔓 Face ID · только лицо: необязательная анимация подтверждённого распознавания лица через отдельно настроенный Shizuku. PIN и отпечаток не выдаются за Face ID.
- ⏰ Создание будильника, автоскрытие пустого острова, прокрутка наверх в поддерживающих приложениях и сохранение раскрытой карточки при касании снаружи.
- 🔋 Батарея: значок с заполнением по текущему заряду и необязательная приблизительная оценка времени зарядки.
- 🔔 Уведомления: история, варианты показа, длительность, тихие сообщения, правила для приложений и диагностика пропусков.
- 🌍 Языки: индонезийский, португальский, казахский, французский и испанский; улучшено переключение языка.
- 💜 Поддержка автора: Telegram и Boosty в разделе «О приложении», с русскими и английскими подписями.
Important
При обновлении с 1.6.1–1.6.5 удалять приложение не требуется: подпись совместима. Android может запросить повторное разрешение ограниченных настроек и включение специальных возможностей. Финальный сценарий на физическом устройстве ещё требует проверки.
На промоиллюстрации показаны примерные значения. Источник погоды: Open-Meteo (CC BY 4.0).
Все изменения — в CHANGELOG.md.
| Карточка | В капсуле | По нажатию |
|---|---|---|
| 🎵 Музыка | Обложка слева от камеры, звуковая волна в цвет обложки справа | Обложка, название, синхронный текст песни, перемотка, ⏪ ⏸ ⏩, вывод звука |
| 📞 Звонки | Входящий — аватар, имя и кнопки сразу; разговор — трубка со временем и волна | Имя, длительность, «Завершить» |
| ⏳ Таймер | Песочные часы и обратный отсчёт, последние 10 секунд красным | Кольцо остатка вокруг паузы, отмена; в конце — звонок и вибрация |
| ⏱️ Секундомер | Время | Пауза, сброс, стоп |
| ⏰ Часы | Таймер или секундомер «Часов» — из уведомления или, если уведомления выключены, с экрана приложения; запись экрана — красным | Крупное время, пауза, открыть приложение |
| 🌙 Будильник | За 12 часов до звонка: луна и время подъёма; когда ставите будильник — плашка «Подъём 7:30 · сон 8 ч 15 мин» | Циферблат сна, как на iPhone: дуга от «сейчас» до будильника, время звонка и сколько осталось спать |
| ⬇️ Загрузки | Значок приложения и кольцо прогресса (Google Play, Telegram…) | Название, полоса и проценты |
| 🔦 Фонарик | Жёлтый значок | Карточка с лучом как в iOS 18: свайп — яркость (Android 13+), нажатие — выключить |
| 🔔 Уведомления | Большая плашка: аватар со значком приложения, имя, текст и кнопки «Ответить» / «Пометить прочитанным» | Ответ прямо в острове; нажатие открывает приложение, свайп вверх убирает |
| 🧭 Навигация, такси, доставка | Стрелка поворота и расстояние, у такси и доставки — время подачи | Куда поворачивать, время прибытия, сколько ехать, «Открыть» |
| ⚡ Зарядка | Молния, проценты и батарейка | Полоса заряда |
| 🕐 Пустой остров | Маленькая капсула над камерой | Часы, дата, заряд, таймер на 1–99 мин, секундомер, фонарик |
Если активностей две — например, музыка и таймер, — вторая уходит в круглый пузырь рядом с островом. Нажатие на пузырь раскрывает её.
Короткие уведомления в капсуле, каждое включается отдельно:
| ⚡ Зарядка началась / остановлена | 🪫 Низкий заряд (5%) | 📶 Wi-Fi подключён / отключён |
| 🎧 Наушники подключены / отключены (с зарядом) | 🔕 Звук / вибрация / без звука | |
| 🔆 Адаптивная яркость | 🔌 USB-устройство | 🔓 Разблокировка |
| 🌙 Не беспокоить | 💳 Приложите к терминалу | ✅ Оплачено |
- Скачайте
DynamicIsland.apkсо страницы последнего релиза и установите. - Откройте приложение — на «Главной» нажмите «Открыть спец. возможности» и включите «Динамический остров».
На Android 13+ появится «Ограниченная настройка»: закройте окно, откройте О приложении → ⋮ → Разрешить ограниченные настройки и повторите шаг 2. Пункт в меню «⋮» появляется только после первой попытки.
- «Главная» → Разрешения: включите Доступ к уведомлениям — без него не будет музыки, загрузок и таймеров Часов.
- Там же нажмите Звонки и разрешите доступ к телефону, журналу звонков и контактам — тогда остров покажет входящий с любой звонилкой.
- На Android 12+ разрешите Bluetooth, чтобы видеть имена наушников.
- Оформление → Положение и размер — остров станет красным: сдвиньте его, пока красное не окажется ровно над камерой, и подберите ширину и высоту. Камера-капля — включите «Как вырез».
Tip
Если остров пропадает (Xiaomi и HyperOS, Oppo, realme, Samsung, Infinix…): Разрешения → Чтобы остров не закрывался — батарея без ограничений, автозапуск и закрепление в недавних.
| Что пишет телефон | Что сделать |
|---|---|
| «Приложение заблокировано для защиты устройства» / «Потенциально вредоносное приложение» (Play Защита) | Так Google встречает любое приложение не из Play Маркета, которое просит спец. возможности. Код открыт — его можно проверить. Play Маркет → значок профиля → Play Защита → ⚙️ → временно выключите «Сканировать приложения», установите остров и включите обратно |
| «Ошибка при синтаксическом анализе пакета» / «There was a problem parsing the package» | Файл скачан не до конца или открыт не тем приложением. Скачайте DynamicIsland.apk со страницы релиза в Chrome и откройте его из загрузок Chrome или через «Файлы» Google, а не из TikTok, Telegram или загрузчиков видео |
| «Приложение не установлено» поверх старой версии | С 1.6.0 и старше — один раз удалите старую версию: у 1.6.1+ новый ключ подписи |
| «Ограниченная настройка» / «Доступ запрещён» при включении службы | См. шаг 2: О приложении → ⋮ → Разрешить ограниченные настройки |
| Установилось, но острова нет (Xiaomi, MIUI, HyperOS) | Включите службу в «Спец. возможностях» (шаг 2). Затем О приложении → Автозапуск — вкл.; Контроль активности («Экономия заряда») → Нет ограничений; Другие разрешения → «Отображать всплывающие окна, когда запущено в фоне» — разрешить. И закрепите остров в недавних: потяните его карточку вниз |
Новые версии ставятся поверх старых, настройки сохраняются (с 1.6.0 и старше — один раз переустановить, см. выше).
Tip
Обновлять можно прямо в острове, а можно через Obtainium: добавьте ссылку https://github.com/Akira9021/Dynamic-Island- — APK в релизах всегда называется DynamicIsland.apk.
| Действие | Результат |
|---|---|
| Нажатие | Раскрыть (можно сменить: открыть приложение, пауза, следующий трек, ничего) |
| Двойное / долгое нажатие | Настраивается, долгое по умолчанию открывает приложение |
| Потянуть вниз | Раскрыть — капсула тянется за пальцем |
| Потянуть вверх, нажатие или касание мимо | Свернуть |
| Толкнуть влево / вправо | Следующий / предыдущий трек |
| Нажатие на звонящий таймер | Выключить звонок |
Четыре вкладки:
- Главная — живой пример, включён ли остров, разрешения и «Проверка»: все примеры острова на одном экране.
- Функции — что показывает остров и как с ним обращаться:
- Динамические карточки, уведомления и события — каждую можно выключить; у уведомлений — кнопки ответа, число строк и цвет кнопок: сиреневый, системный, из аватара или свой.
- Текст песен — в раскрытом плеере.
- Жесты и поведение — когда показывать и сворачивать остров, кружок второй активности, виброотклик, включение экрана при звонке.
- Системные плашки — быстрый переход к настройкам Android, где выключаются всплывающие плашки звонилки, «Часов» и батареи, чтобы эти события показывал только остров.
- Язык — русский или английский, сразу для приложения и острова («Общие → Язык»).
- Оформление — как выглядит остров:
- Положение и размер — сдвиг по горизонтали, отступ сверху, ширина, высота и «Как вырез»; капсула меняется на экране сразу.
- Размер с активностью — насколько капсула с активностью толще и шире спокойной, с живым примером.
- Цвет капсулы — цвет, контур (цвет, толщина, цвет из обложки) и тень.
- Liquid Glass (экспериментальный) — стеклянный остров и карточки, плотность стекла.
- Раскрытие острова — стиль («Как Фрукт» с эффектом желе, «Пружина», «Плавно», «Без анимации»), длительность, упругость, «Уменьшить эффекты».
- Эффекты — размытие, живой эквалайзер, вздрагивание, волны оплаты, свечение обложки и экономия заряда.
- О приложении — версия и обновления (автопроверка раз в 3 часа, «Проверить сейчас», «Что нового»), инструкция, диагностика навигации и «Страница GitHub» — ссылка сюда.
Для разработчиков
Kotlin, Jetpack Compose, Material 3. Нужны JDK 17 и Android SDK 35.
./gradlew assembleDebug # app/build/outputs/apk/debug/app-debug.apk — для своего телефона
./gradlew assembleRelease # app-release-unsigned.apk — релизную подпись ставит CIКаждый push собирает APK в GitHub Actions. Чтобы выпустить новую версию, повысьте versionName и versionCode в app/build.gradle.kts и значок версии в начале обоих README и добавьте раздел ## [x.y.z] в CHANGELOG.md и CHANGELOG.en.md — после push в основную ветку релиз с APK и описанием на двух языках создастся сам. Тег v* тоже работает.
| Файл | За что отвечает |
|---|---|
service/IslandService.kt |
Служба спец. возможностей и два окна: рисования (на всю ширину, сквозь него проходят касания) и касаний (невидимое, точно над островом) |
service/NotifListener.kt |
Доступ к уведомлениям: звонки, загрузки, таймеры из уведомлений |
service/MediaMonitor.kt |
Медиасессии любого плеера, обложка и её цвет, текст песен |
service/SystemEvents.kt |
Зарядка, Wi-Fi, наушники, режим полёта, звук, яркость, USB, разблокировка |
lyrics/LyricsRepo.kt |
Текст песен: LRCLIB, затем NetEase |
service/CallMonitor.kt |
Звонки по состоянию телефона, имя и фото из контактов |
island/IslandOverlay.kt |
Выбор главной активности и пузыря, форма, пружины, жесты |
island/Compact.kt, Expanded.kt |
Свёрнутые и раскрытые виды карточек |
ui/ |
Приложение настроек |
Почему два окна: если менять размер окна во время анимации, Android на кадр показывает старую картинку в новом месте — и остров дёргается. Поэтому окно рисования не меняет ширину никогда, а невидимое окно касаний двигается за островом и передаёт касания.
Ключ подписи в репозитории не хранится: Gradle собирает APK без подписи, а подписывает его CI ключом из секретов GitHub (KEYSTORE_BASE64, KEYSTORE_PASSWORD) и сверяет отпечаток сертификата. Локальная отладочная сборка подписывается обычным отладочным ключом.
Идея и поведение — из Dynamic Island для Windows (mihailkotovski): пружинные анимации, плеер по клику, толчок вбок для смены трека, таймер с кольцом, текст песен с LRCLIB. Тексты песен — LRCLIB.
