An iPhone-style Dynamic Island for Android, built for the Galaxy Z Fold 8.
New notifications grow out of the front camera as a small island, show the app, title and text for a few seconds, and then slip back into the camera. Tap the island to open the notification.
Work in progress. No official APK has been released yet. The app is still changing, so behavior, settings and this guide may change without notice. Until the first release, build it from source.
There are already a few apps that bring the Dynamic Island to Android, but they are full of ads. So I decided to build my own.
- Android 16 or later
- Tested on the Galaxy Z Fold 8 with One UI 9, on both the cover screen and the main screen
No release has been published yet, so for now build from source: open the project in Android Studio and run it, or connect the phone with USB debugging on and run:
./gradlew installDebugOnce releases are available, download the latest dynamic-android-vX.Y.Z.apk from Releases on the phone and open it. If the phone asks, allow your browser or file manager to install unknown apps. If a copy built with a different signing key is installed, such as one you built yourself, uninstall it first. Android refuses to update an app whose signature has changed.
Open Dynamic Android and turn on both permissions from its first screen.
- Accessibility service: tap Open settings, find Dynamic Island under installed apps and turn it on. The app uses it only to draw the island above the status bar.
- Notification access: tap Open settings and turn on Dynamic Island notifications. The app uses it to read new notifications.
Apps installed from an APK file usually start with these switches greyed out. If so, open the app info page, tap ⋮ and choose Allow restricted settings first.
The island does not replace your phone's own notification pop-ups. Android does not let an app hide them, so if you leave them on, every notification shows up twice: once as the system pop-up and once in the island.
On Samsung phones, turn them off over adb:
# Turn off the standard pop-ups ("Detailed" style).
adb shell settings put global heads_up_notifications_enabled 0
# Switch away from the "Brief" style (edge lighting), which ignores the setting above.
adb shell settings put system edge_lighting 0You need both. With only the first one, Samsung's brief pop-ups still appear.
To bring the pop-ups back:
adb shell settings put global heads_up_notifications_enabled 1
adb shell settings put system edge_lighting 1Without adb, you can turn off pop-ups app by app in the phone's settings instead (Apps → the app → Notifications → Notification categories → turn off pop-ups). Menu names differ between One UI versions. Keep sound or vibration on for those apps, because the island skips silent notifications.
Once the pop-ups are off, notifications from apps you hide in the island settings only appear in the notification shade.
Open Camera position → Adjust. The screen turns white and shows dashed lines that cross at the island's center, with a ring for the island's circle. Change Horizontal, Vertical and Circle size until the lines cross at the center of the camera and the ring sits right around it.
Do this once per screen. On a foldable, do it once on the cover screen and once on the main screen. The position follows the screen when you rotate the phone, so you can line it up in any orientation. Reset goes back to the detected position.
- Language: System default, English or Korean. You can also change it in the phone's settings under Apps → Dynamic Android → Language.
- Camera position
- Follow the camera: the island grows out of the camera on whichever edge it is, in every orientation. The default.
- Top of the screen: the island always opens from the top. When the camera is at the top it still grows out of it; when the phone is turned so the camera is on another edge, it opens from the top center.
- Adjust sets the camera position and circle size for the screen you are on. The cover screen and the main screen each keep their own.
- Animation
- Style 1: the island stretches and drops into a card in one motion.
- Style 2: the island stretches into a pill, pauses, then drops into a card. The pause is adjustable from 0 to 300 ms.
- Test shows a sample island right away, so you can try the style and camera position.
- Verification codes
- Show codes large: when a notification carries a login or verification code, the island shows the code in large type instead of the message. On by default.
- Copy automatically: the code is copied to the clipboard as soon as the island shows it. On by default.
- Codes are looked for only in notifications with a code word such as 인증번호, OTP or verification code, so numbers in ordinary messages are left alone. Phone numbers, dates, times, amounts and masked card numbers are never taken as codes. If a code is missed, add a word from that message under Extra code words.
- Codes are not shown or copied on the lock screen.
- Android hides the text of some code notifications from apps like this one, and the island cannot find those codes.
- Keyword filters: pick an app and list keywords for it.
- Hide when it contains: the app's notifications with any of the keywords stay out of the island.
- Show only when it contains: only the app's notifications with one of the keywords appear in the island.
- Keywords are looked up in the title, text and chat room name, ignoring case. Earlier messages of a conversation are not checked. An app hidden under Notification apps stays hidden whatever its keywords.
- Notification apps
- Show all apps: every app appears in the island except the ones you check.
- Show no apps: only the apps you check appear in the island.
With Follow the camera, the island always grows out of the camera, wherever rotating the phone puts it:
- Camera at the top: the island opens downwards, with the notification below the camera.
- Camera on the left or right (landscape, or a foldable's main screen held upright): the island stretches into the screen from the camera and opens up and down around it, with the notification beside the camera.
- Camera at the bottom (upside down): the island opens upwards, with the notification above the camera.
With Top of the screen, the island opens from the top in every orientation instead.
The island shows new notifications that would normally alert you, while the screen is on, including the lock screen. It skips:
- Ongoing notifications such as music, downloads, calls and alarms
- Group summaries
- Silent notifications and notifications blocked by Do Not Disturb
- Quiet updates to a notification that is already showing
- Notifications left out by a keyword filter
On the lock screen, the island shows only the app name and "New notification" unless the notification is marked as public. Notifications marked as secret are not shown there at all.
./gradlew testDebugUnitTest # unit tests
./gradlew assembleDebug # debug APKAndroid Studio's bundled JDK works for command-line builds:
export JAVA_HOME="/Applications/Android Studio.app/Contents/jbr/Contents/Home"
export ANDROID_HOME="$HOME/Library/Android/sdk"Pushing a tag such as v0.1.0 runs the release workflow. It runs the unit tests, builds a release APK shrunk with R8, signs it and attaches it to a GitHub release for that tag. The version name comes from the tag.
The signing key never goes into the repository. Set it up once:
-
Create a keystore on a machine you trust.
keytoolasks for a password; choose your own.keytool -genkeypair -v -keystore dynamic-android-release.jks -alias dynamic-android \ -keyalg RSA -keysize 4096 -validity 36500
Back up the keystore file and its password somewhere safe, such as a password manager. If you lose them, installed copies can no longer be updated and users have to uninstall first.
-
In the repository on GitHub, open Settings → Secrets and variables → Actions and add these repository secrets:
Secret Value RELEASE_KEYSTORE_BASE64Output of base64 -i dynamic-android-release.jksRELEASE_KEYSTORE_PASSWORDThe keystore password RELEASE_KEY_ALIASdynamic-androidRELEASE_KEY_PASSWORDThe key password. keytooluses the keystore password for it by default. -
Tag a commit and push the tag:
git tag v0.1.0 git push origin v0.1.0
The workflow stops with an error if any of the secrets is missing, so an unsigned APK is never published.