-
Notifications
You must be signed in to change notification settings - Fork 1
Releases: SysAdminDoc/AlarmClockXtreme
v1.14.18 — YouTube engine update fix + audit reliability fixes
What's new
YouTube downloader fix:
- Engine update now works — the library's built-in updater was broken because
GitHub rejects bareURL.openStream()requests. The app now falls back to
an OkHttp-based updater with proper headers. - Preview loading is now clearly visible: a 36dp spinning circle replaces the
play icon during the 30-60s resolve phase, with a "Loading preview..." label.
Deep audit reliability fixes (v1.14.17):
- Alarm event analytics: fixed wrong scheduledTime for repeating alarms
- SmartAlarmService: fixed race condition in session teardown (AtomicBoolean)
- AlarmService: fixed audio-start reentry guard race (AtomicBoolean)
- Guardian Angel: stripped USSD-injectable
*#chars from phone sanitizer - Dashboard: added stale-location guard on tornado alert fetch
- AppMetricTile: value text clips with ellipsis on overflow
Install
adb install AlarmClockXtreme-v1.14.18-play.apk
Assets 4
v1.14.6 — Audit hardening + reliability
First signed public release since v1.9.5 — a large feature and reliability jump, capped by an end-to-end engineering, accessibility, and performance audit.
Install (sideload)
- Download an APK below.
- On your phone, allow "Install unknown apps" for your browser/file manager.
- Open the APK and install.
Both APKs are release-signed with the project key, so they install for everyone with no extra steps — no developer keys, no special setup.
Which one?
- AlarmClockXtreme-v1.14.6-play.apk — full build: YouTube alarm-sound downloader, Wear OS bridge, optional Health Connect. Best on phones with Google Play Services.
- AlarmClockXtreme-v1.14.6-fdroid.apk — universal, no-Google build (3.9 MB). Installs on any Android 8.0+ device, including de-Googled/AOSP ROMs.
Minimum Android: 8.0 (API 26).
Verify the download (optional)
SHA-256 sums are in SHA256SUMS.txt. Signing certificate SHA-256:
9e2c13923a20bad3a5a3b8896095b390c8a78c6c44f185e419e6dbfed1437303
Highlights
- Reliability: fixed a smart-wake bug that could double-fire one-shot alarms; backup-import and Direct Boot hardening with regression tests.
- Sleep insights: per-night sleep score and a rolling sleep-debt accumulator on the Statistics tab.
- Dismiss challenges: physical-challenge readiness preflight blocks saving an alarm that could never be dismissed; colorblind/TalkBack support for the Wordle challenge.
- Accessibility & polish: WCAG-AA contrast pass on muted text, button semantics for date pickers, framed empty states, clearer copy.
- Performance: removed steady background churn in the World Clock and Timer.
- Wear OS: next-alarm tile + complication, now with unit-test coverage.
Plus everything added across v1.10–v1.14: adaptive navigation, Philips Hue v2 + TLS pinning, telephony-aware muting, per-alarm vibration delay, encrypted backups, weather-conditional alarms, and more.
Assets 5
v1.9.5 — Premium settings trust pass
AlarmClockXtreme v1.9.5
Premium settings trust pass for wake reliability.
- Adds a Wake readiness checklist for exact alarm access, notification permission, and battery protection.
- Adds direct recovery actions for the Android system settings that affect alarm precision and visibility.
- Updates Settings reliability summary so it reflects all wake-critical system switches.
- Splits alarm-critical notification readiness from optional calendar/location context permissions.
- Includes v1.9.4 next-alarm notification timing refresh improvements for users upgrading from earlier builds.
Verification:
- Signed Play release APK built with R8 and resource shrinking.
- Signature verified with apksigner.
- Manifest verified as com.sysadmindoc.alarmclock, versionName 1.9.5, versionCode 42.
Assets 4
v1.9.0 — Living sky on the Today tab
A living sky behind the Today tab
The Today tab background is now a real sky — interpolated minute-by-minute through a 15-keyframe gradient anchored to your actual sunrise (t = 0) and sunset (t = 1). Storms swap the sky to overcast blue-gray with subtle lightning flashes at night. Active NWS tornado warnings paint a rotating funnel-cloud silhouette plus a red TORNADO WARNING banner.
TimeOfDaySky engine
15 hand-tuned keyframes covering t = -0.40 (deep night before dawn) through t = 1.40 (post-dusk night), each carrying a 3-stop gradient (zenith / mid-band / horizon). Verified on device at 7:43 PM with sunset at 8:01 PM (t ≈ 0.977) — interpolation produced deep violet zenith, burgundy mid, dusky orange horizon, exactly between the golden hour (t = 0.93) and sunset starting (t = 0.98) keyframes at frac = 0.94.
Weather-aware overrides
- Storm (Open-Meteo codes 95-99) swaps the time-of-day sky for
STORM_DAY(gray-blue overcast) orSTORM_NIGHT(near-black) depending on time. - Lightning flashes layer on top of any storm sky — stochastic 4-9-second cadence, 60ms ramp / 220ms decay to ~28% white, ~30% chance of a double-strike aftershock.
- NWS tornado warnings trigger
TORNADO_SKY(dark olive ceiling / sickly yellow-green horizon — the classic plains-state warning sky), a rotating Canvas-drawn funnel cloud silhouette with drift animation, and a red TORNADO WARNING banner pinned below the status bar.
NWS alerts integration
New WeatherAlertsApi + WeatherAlertsRepository against api.weather.gov/alerts/active. Free, no key, US-only by API design (returns empty features for non-US lat/lon, so it's safe to call unconditionally). Sends a User-Agent identifying the app + repo URL per NWS rate-limit policy. Failures absorbed silently — alerts are bonus context, never the critical path.
Architecture
ui/theme/WeatherSky.kt— keyframe table, RGB lerp,computeT(now, sunrise, sunset), weather overrides.ui/components/WeatherSkyBackground.kt— 5-layer stack: sky gradient → fade toSurfaceDarkbelow the hero → lightning → tornado funnel → content.AlarmClockHeroHeadergains atransparent: Boolean = falseparameter; when true, skips its own gradient so the parent sky backdrop shows through. Other tabs unchanged.DashboardUiStateplumbssunriseLocal,sunsetLocal,currentWeatherCode,tornadoAlertActive,severeWeatherHeadline.- The hero shows an inline Tornado warning status chip when active so the signal is visible before the user scrolls.
Privacy
- Alerts call sends only your latitude/longitude to NWS — no other data, no auth, no fingerprinting.
- Tornado coverage is US-only because NWS only issues alerts for the United States. International users get the time-of-day sky and storm/lightning visuals; the tornado overlay never triggers.
Download: AlarmClockXtreme-v1.9.0-play.apk — signed Play-flavor APK, ~62 MB.
Assets 3
v1.8.1 — Premium polish pass
Premium polish pass
A top-to-bottom design audit. No new features, no schema changes — every change in this release sharpens an interaction or surface that already worked but felt rough on close inspection.
Bottom navigation (the most visible change)
alwaysShowLabel = false. With six tabs in 1080 px, every label was ellipsizing ("Weath..." / "Setti...") which read as broken layout. The Material 3 idiom for crowded bars is exactly this: the selected tab carries its label inside the indicator pill, the rest sit as confident icons. The pill becomes the focal affordance.
Live radar (Today tab)
- Skeleton + fade-in. The 360 dp WebView slab used to flash dark for 1–3 s on cold connections. New
WebViewClienthooks drive aloadedflag; a shimmering skeleton fills the slot and cross-fades out (240 ms) as the WebView fades in (280 ms). - "Open in Windy" relocated from a left-aligned
TextButtonunder the map to a header-aligned chip — no more orphaned link below a centered map.
News tab
- Pull-to-refresh via Material 3
PullToRefreshBox— the canonical RSS gesture. - Skeleton list (4 placeholder cards) on first load instead of a single spinner card.
AppFilterChipprimitive on the feed picker — consistent geometry with the rest of the app's chips.- News card title clamped to 3 lines so very long Google News headlines don't blow out the card height.
Design system
AppIconSizetokens (xs/sm/md/lg = 14/18/22/32 dp) replace ad-hoc 13/15/18/20/22 dp drift across cards, chips, tiles, and metric tiles.AppFilterChipprimitive matchesAppStatusChipgeometry. AlarmList's group filter row + News's feed picker migrated off raw MaterialFilterChip.AppSkeletonBlockprimitive for shimmering placeholder rows.
Microcopy
Every hero subtitle, section description, and empty-state copy went through a "≤12 words and only what's true" pass. Alarms idle subtitle, Groups description, Quick alarms description, Today calendar empty states, News empty/error states all rewrote.
Typography rhythm
In-card section headers ("Next few hours", "Next 3 days", "Today's schedule", "Live radar") promoted from titleSmall (15 sp) to titleMedium (17 sp SemiBold) so card-level titles hold one tier above metric-tile values.
What's New refresh
The "What's New" dialog had been showing v1.6.0 highlights through three minor releases. Now reflects v1.8.0 actuals.
Download: AlarmClockXtreme-v1.8.1-play.apk — signed Play-flavor APK, ~62 MB.
Assets 3
v1.8.0 — Weather hub + News tab + live radar
Two new tabs and a live radar
The former "Today" tab graduates into a full Weather hub with an animated precipitation radar embedded from Windy.com, and a brand-new News tab pulls public RSS feeds (Google News, BBC, NPR, Hacker News). Both follow the existing no-account / no-API-key rule.
Live radar (Weather tab)
- New
WindyRadarCardcomposable — fixed-height (360 dp)WebViewpointed atembed.windy.com/embed2.htmlwithoverlay=radar+radarRange=-1for animated playback. - Auto-centers on the user's weather location (lat/lon already plumbed for forecast).
- Hardware-accel default kept (software-layer tore the radar in early prototypes).
- Secondary Open full map in Windy button hands off to the system browser via
LocalUriHandlerfor users who want pan/zoom past what the embed allows.
News tab
- Six predefined feeds: Google News (Top / World / Tech), BBC, NPR, Hacker News. Selectable via filter chips.
- Active feed persisted to DataStore.
- Each headline renders as a tappable card with title, 3-line snippet, source chip, relative-time chip ("58m ago"), open-in-new icon.
- Pull-to-refresh via the hero refresh button.
- External links open in the system browser via
LocalUriHandler. - Custom feed URLs supported by overwriting
newsFeedUrlin DataStore (UI-level picker arrives in a follow-up).
Architecture
- Zero new external dependencies. Reuses the existing OkHttp 4.12.0 client (15 s timeouts, shared with weather + holiday + webhook calls).
RssParseris pure platformXmlPullParser— no Rome (~600 KB JAXB skipped). Handles RSS 2.0 + Atom from one entry point, descends into<channel>/<feed>containers, falls back to channel title for missing source. RFC-822 + ISO-8601 dates.- News stack totals ~250 lines of Kotlin.
Nav + settings
- "Today" tab → Weather label + hero retitled.
- News added as a sibling tab — bottom nav now hosts 6 tabs (Weather / Alarms / Timer / World / News / Settings).
- Tab labels clamped to one line + ellipsis so a 1080-px phone doesn't wrap "Weather" / "Settings" to two lines.
- New Settings toggles: Show News tab, Live radar on Weather tab. The renamed Show Weather tab replaces "Show Today tab".
Privacy
The radar embed loads inside Windy's iframe — Windy's privacy policy applies inside that surface. RSS calls go straight to the publisher, no auth, no tracking. The app itself still has no analytics, no accounts.
Download: AlarmClockXtreme-v1.8.0-play.apk — signed Play-flavor APK, ~62 MB. Includes the YouTube alarm-sound downloader (yt-dlp + NewPipe Extractor) plus the new Weather + News features.
Assets 3
v1.7.5 — Visual UX uniformity pass
Visual UX uniformity pass
Real-device tour exposed three GUI/UX regressions in v1.7.4. All fixed without schema or feature changes.
Fixed
- Timer tab — empty area below hero on devices with no active timers. Switched the parent
ColumntoverticalScroll, droppedweight(1f)onTimerInputView(Cardwraps to content height regardless of weight), and replaced the innerLazyColumnfor active timers with aforEachColumn. 24dpSpacerat the bottom keeps the input card breathing above the floating nav. - World Clock tab — saved cities not rendering despite the "N cities" hero chip. Replaced the inner
Scaffold(which competed for system insets with the outerAppNavigationScaffold) with aBoxthat hosts a singleLazyColumn(hero is the first item, mirroringAlarmListScreen). FAB overlaid viaBoxBottomEndalignment.contentPadding.bottom = 96.dpkeeps the last city out from under the FAB. The "N cities" chip is hidden in the empty state. - Alarms tab — "Swipe to delete" text bleeding through disabled alarm cards.
AlarmCardusesSurfaceCard.copy(alpha = 0.55f)for disabled alarms, so theSwipeToDismissBoxbackground (always rendered, just transparent when not swiping) showed through. Looked like a stuck swipe gesture. Now gated onisSwiping = currentValue != Settled || targetValue != Settledso the affordance only paints during an active gesture. AddedLaunchedEffect(Unit)snap-to-Settledso a saved partial-drag offset can't survive across navigation. - Today tab — duplicate "Now" cells in the hourly strip. The
isFirstFutureSlotpredicate ran a 45-minute window check on every cell, tagging two or three adjacent hours all as "Now". Replaced with a single-flagfirstNowAssignedtoggled after the first matching cell.
Build
- R8 release build now succeeds with NewPipe Extractor's Mozilla Rhino dependency on board. Added
-dontwarn javax.script.**,-dontwarn org.mozilla.javascript.**, and explicit keeps for Rhino's reflection-loaded classes so YouTube signature decoding still works in minified release builds.
Download: AlarmClockXtreme-v1.7.5-play.apk — signed Play-flavor APK, ~62 MB. Includes yt-dlp + NewPipe Extractor for the YouTube alarm-sound downloader.
Assets 3
v1.5.4 — Reliability hardening
v1.5.4 — Reliability hardening
No new features, no schema changes. Targets real bug classes that became visible under Android 14+ foreground-service timing rules and rarer OEM device quirks.
Fixed
- FGS start timing on Android 14+.
AlarmService.onStartCommandnow promotesstartForeground()out of theDispatchers.IOcoroutine. A placeholder notification is posted synchronously; the labelled version replaces it viaNotificationManager.notify()once the alarm row is fetched. PreventsForegroundServiceDidNotStartInTimeExceptionunder Doze cold-start with heavy IO contention. - BootReceiver ANR window.
withTimeout(30s)→withTimeout(8s)aroundAlarmScheduler.rescheduleAll.goAsync()caps at ~10 s on most Android versions, so the old ceiling would trip ANR before the timeout fired. - Null-safe
getSystemService(...)casts acrossAlarmService,SmartAlarmService,FlipDetector,ShakeDetector,SquatDetector,StepCounterListener, andProximityCoverDetector. Stripped-down AOSP and managed-profile devices have been seen to return null for sensor / power services; hard casts would crash at construction. - Wake-lock acquisition guarded. Rare OEM
SecurityExceptionfromPowerManager.newWakeLock()no longer kills the service before it can foreground.
Artifacts
AlarmClockXtreme-1.5.4-play-release.apk— R8 minified, release-signedAlarmClockXtreme-1.5.4-play-debug.apk— debug build for local install
See CHANGELOG.md for the full version history.
Assets 4
v1.5.3
v1.5.3: premium UX/UI polish pass - Add slide+fade transitions between all nav screens (AppNavigation) - AlarmCard: remove redundant Enabled/Paused chip; Switch communicates state - AlarmCard: add animateItem() for smooth reorder animation - AlarmCard: replace raw challenge enum labels with polished display names - AlarmList: remove redundant Search section title from search card - QuickAlarms: add divider above Power nap sub-section - AlarmEdit: remove duplicate Save button from TopAppBar - AlarmEdit: group field only shows custom text input when needed - Settings: remove On/Off text labels from toggle rows - Settings: fix time format showing '0m 15s' instead of '15s' - Onboarding: animate pager indicator dot width with animateDpAsState - Theme: add ClockTimeSmall/Display/Large named TextStyles; replace 3 hardcoded fontSize values across AlarmListScreen, AlarmEditScreen, DashboardScreen
Assets 2
v1.2.1
Bug Fixes
- Fixed unsolvable maze challenge — maze generator now validates path solvability via BFS before presenting to user, preventing permanent alarm lock-out
- Fixed DashboardViewModel state race conditions — replaced 18 non-atomic
StateFlowmutations withupdate {}to prevent lost state when weather and calendar load concurrently - Fixed exact alarm SecurityException on API 31-32 — bedtime reminder now checks
canScheduleExactAlarms()before scheduling - Fixed alarm group filtering — selecting a group now actually filters the alarm list (was tracked in state but never applied)
Improvements
- Updated launcher icon with new vector design + rasterized PNGs for all densities
- Added Room database schema exports (v4-v6) for migration testing
- Added project branding assets (banner, favicon, icons)
- Cleaned up stale version defaults and proguard comments