Torch, strobe, SOS, and screen light
| Document | Description |
|---|---|
| Main Controls | Explains the main flashlight, screen light, mode, slider, and auto-off controls. |
| App Preferences | Documents saved app preferences and how user choices persist locally. |
| Build | Explains Gradle, R8, and ProGuard choices for the current GitHub Actions build. |
| Design | Defines icon, dimming, layout, and visual design rules for the app. |
| Permissions | Explains Camera permission behavior, fallback states, and recovery prompts. |
- first stable Google Play release
- forced readable status bar icons on the dark main screen while keeping the existing edge-to-edge layout
- added dynamic Screen Light status and navigation bar contrast so bright screen colors use dark icons and dark screen colors use light icons
- removed the Android 3-button navigation contrast scrim on both screens while preserving edge-to-edge inset handling
- made the dimmed Strobe Speed warning icon decorative only so inactive controls do not open the warning modal
- added warning logs around torch camera probing and fallback paths so device-specific flashlight issues are easier to diagnose
- kept torch availability, strength detection, and fallback behavior unchanged
- moved the Screen Light color tray row into XML and kept Kotlin focused on toggle behavior
- moved the Screen Light floating back button into XML while preserving its click, haptic, and inset behavior
- moved Auto-off preset mapping into one small source-of-truth helper while preserving saved preference normalization and button selection behavior
- made Screen Light preset application and saving read from the same color resources used by the visible swatches
- constrained Screen Light chevron and back icon scaling and tinting in the host XML so Material vector intrinsic size and fill stay generic
- removed the unused icon intrinsic dimension shim after resetting SVGs to standard Material defaults
- aligned the XML default Strobe Speed slider position with the saved Medium default
- kept the active and dimmed Strobe Speed sliders starting at Medium (3 Hz) before preference restore completes
- enabled edge-to-edge layout handling in both activities for Android 15+ system bar behavior
- added main screen inset handling so the main content and Screen Light button avoid system bars and display cutouts
- added Screen Light inset handling so the bottom color tray and floating back button avoid system bars and display cutouts
- requested inset dispatch after registering edge-to-edge listeners so system bar padding is applied deterministically
- folded one-value Screen Light color and dimension files back into the shared resource files
- remembered whether the Screen Light color tray was collapsed or expanded when reopening Screen Light
- saved the Screen Light tray state locally only when the user taps the tray toggle
- remembered the selected Torch brightness level on devices with torch strength support
- restored saved Torch brightness only after clamping it to the current device max strength
- fixed Auto-off service updates so brightness and strobe changes no longer reset an active timer
- added a legacy launcher icon fallback for Android 7.x devices while keeping the Android 8+ adaptive icon path unchanged
- removed the transparent power halo gap cleanup layer, unused dimension, and dead drawable
- corrected SOS timing gaps so symbol, letter, and word pauses use separate durations
- moved Screen Light tray accessibility labels into string resources and removed small stale resource shims
- fixed the active power halo gradient so it no longer renders as a donut ring
- disabled the dark halo gap mask after testing showed it created a visible black ring around the power button
- kept the halo behind the unchanged 156dp power button while letting the button face naturally cover the glow center
- kept the active halo XML-only with no image assets
- enlarged the active power halo from 196dp to 228dp so the glow has enough room to bloom outside the 156dp button
- added a dark oval gap mask between the halo and the button so the glow no longer appears to touch the button edge
- widened the XML radial halo and reduced the lower crop so the glow wraps farther down the button while still fading out near the bottom
- increased the active halo alpha so the ON state reads clearly on the dark background
- moved the active power glow into a separate larger halo layer behind the unchanged 156dp power button
- kept the halo as a plain decorative view controlled by
MainActivity.ktinstead of a custom self-watching view - kept the halo non-clickable while preserving the original power button touch target
- kept the ON power button background face-only so the button shape does not change between OFF and ON states
- restored the ON power button face sizing so the button does not visually shrink when active
- replaced the hard active glow arc strokes with a soft radial haze
- removed the bad ON glow inset dimensions that made the active button look smaller
- kept the active glow static and subtle so it reads like light spill instead of a border
- added a separated upper arc glow to the ON power button state
- added a dark glass Auto-off countdown pill inside the power button
- tightened countdown spacing to 4dp above and below while keeping the icon and ON/OFF label sizes unchanged
- changed the Screen Light back button ripple from translucent white to translucent black
- kept the Screen Light color swatch ripple behavior unchanged
- reduced the visible Screen Light back button oval and ripple to 40dp while keeping the 48dp tap target
- rebalanced the 20 Screen Light preset colors to reduce near-duplicates across warm, alert, blue-green, and playful tones
- updated Screen Light preset accessibility names to match the new color roles
- matched the Screen Light preset RGB values used when tapping swatches to the visible swatch colors
- defined the Screen Light back button background color resource explicitly
- fixed the Screen Light back button press feedback so it uses an oval ripple instead of a faint square foreground flash
- lightened the Screen Light back button background so it stays less distracting than the bottom control panel
- added tap haptic feedback to the Screen Light back button
- added tap haptic feedback to all Screen Light color swatches
- added a color-row chevron toggle to collapse and reopen the Screen Light color tray
- kept the floating back button position, size, icon, and behavior unchanged
- removed inactive and selected borders from Screen Light color swatches
- tightened Screen Light swatch spacing from 3dp to 2dp
- matched the Screen Light swatch panel scrim to 45% black
- added a floating top-left Screen Light back button without adding a header
- kept the Screen Light swatches as clean borderless square color blocks
- changed Screen Light color swatches to square corners
- expanded Screen Light from sixteen fixed color presets to twenty common color presets
- kept the Screen Light swatch grid unlabeled and accessibility-named
- removed visible labels from the Screen Light color swatches while keeping accessibility names intact
- replaced the rail-style Screen Light swatch group with compact unlabeled rectangle tiles
- expanded Screen Light from four fixed color presets to sixteen common color presets
- removed the extra
Presetslabel from the Screen Light panel - removed unused Screen Light swatch text color resources after the labels were removed
- converted
ScreenLightActivity.ktfrom manualfindViewByIdview lookup to generated View Binding - moved the Screen Light color label into a formatted string resource instead of building it with Kotlin string concatenation
- replaced always-visible Screen Light RGB sliders with simple fixed color preset tiles
- kept Screen Light color restore, preset selection, and keep-screen-on behavior intact
- updated the launcher icon foreground PNG while keeping the existing adaptive launcher icon wiring
- confirmed the launcher manifest icon still points through the existing
@mipmap/ic_launcherresource
- renamed the shared segmented control rail drawable from
bg_mode_switch_rail.xmltobg_segmented_control_rail.xml - renamed the shared segmented control button color selector from
mode_switch_button_bg.xmltosegmented_control_button_bg.xml - rewired the Mode and Auto-off segmented controls to use the new shared rail drawable and button color names
- removed the old narrow mode rail drawable and mode button color selector after confirming layout references were updated
- moved hardcoded resource color literals into
colors.xmland rewired layouts, drawables, vectors, and color selectors to named colors - added
dimens.xmlfor shared layout, typography, slider, power button, dialog, and drawable dimensions - removed the unused
AppCardMaterialCardView style and theme hook fromthemes.xml - kept the existing visual design and control behavior unchanged while cleaning resource names and orphans
- cleaned
MainActivity.ktby splitting the large startup setup into focused helper methods - organized Torch, Strobe, and SOS power button handling into smaller mode-specific start and stop helpers
- added named constants for countdown timing, Auto-off values, Strobe slider bounds, brightness label ratios, disabled alpha, and default torch strength
- cleaned service intent extras by importing the torch intensity extra directly alongside the other service extras
- kept the existing permission flow, Auto-off countdown, Strobe/SOS behavior, brightness controls, Screen Light launch, and warning dialog behavior unchanged
- cleaned
TorchService.ktwith clearer service state, intensity, and notification naming - moved foreground notification channel setup into a dedicated helper while keeping the same persistent torch notification behavior
- added named constants for Auto-off timing, default torch intensity, notification request code, and SOS pattern timing
- simplified Auto-off scheduling math and removed duplicate handler cleanup while keeping Torch, Strobe, SOS, and notification shutdown behavior unchanged
- cleaned
ScreenLightActivity.ktby splitting slider setup and preset button setup into focused helper methods - reduced Screen Light RGB slider preference writes by saving custom colors when dragging stops while keeping live color preview
- added named Screen Light preset/color constants and locale-stable hex color formatting
- cleaned
AndroidManifest.xmlby removing the manifest package attribute and stale optional notification comment - kept Camera and foreground service declarations focused on the active torch service behavior
- hardened saved preferences so invalid mode, Auto-off, Strobe Speed, and Screen Light color values fall back to supported defaults
- added a safe DataStore read fallback so preference restore can recover from temporary local read errors
- simplified Strobe Speed preset mapping with named constants for the five supported slider stops
- cleaned
TorchController.ktby removing the reflection-based torch strength shim and using the Android 13+ API directly - reset cached camera state when a camera ID becomes invalid so hardware detection can be retried cleanly
- removed the unused Camera permission rationale string after keeping the simpler built-in Android permission dialog plus inline recovery message flow
- removed legacy Jetifier from
gradle.propertiesand kept the simple root Gradle buildscript setup - tightened the Android release workflow with safer Gradle download and keystore restore steps while keeping manual GitHub Actions releases simple
- deleted the unused empty
app/proguard-rules.profile because release minification and resource shrinking are disabled - cleaned
app/build.gradleby removing unused vector drawable support config and broadMETA-INF/*packaging exclusions
- cleaned Auto-off service scheduling so the service uses one reusable Auto-off check instead of stacking repeated delayed checks
- moved the Brightness value labels into
activity_main.xmland aligned Brightness slider header spacing with Strobe Speed - removed the custom Quick Settings tile because Android already provides a built-in flashlight tile and this app is focused on the full in-app control surface
- cleaned temporary Gradle verbosity settings from
gradle.properties - removed unused AndroidX dependencies and leftover unused strings that were not referenced by code or layouts
- renamed Strobe Speed labels to Very Slow, Slow, Medium, Fast, and Very Fast
- changed the default Strobe Speed to Medium (3 Hz)
- added adaptive Brightness labels so supported devices show Low, Medium, High, or Max based on their own torch strength range
- fixed Strobe Speed active/dimmed state syncing when switching between Torch, Strobe, and SOS
- hardened the Strobe Speed active and preview layers so only the active Strobe slider can receive touches
- restored the 0.7.5 home-screen visual design, including the original control layout, colors, icon treatment, and footer placement
- kept the simplified
ic_mobile.xml,ic_power.xml, andic_warning.xmlfilenames while restoring the 0.7.5 icon visuals - retained the 0.8.0 locked Auto-off behavior fixes while restoring the 0.7.5 visual design
- hardened locked Auto-off behavior so the dimmed Auto-off bar rejects touches while a light mode is active
- enforced a valid Auto-off selection so the Auto-off bar cannot end up with nothing highlighted
- normalized unsupported saved Auto-off values back to
Off - kept locked Auto-off changes from saving new preferences while Torch, Strobe, or SOS is active
- cleaned and renamed the warning, main power, and mobile icons as standard Material vectors with layout-controlled sizing and tinting
- moved the Strobe Speed warning icon immediately after the Strobe Speed title so it reads as part of the label
- kept the Strobe Speed value flush right in the header with no trailing right gap
- mirrored the warning icon and speed value in the dimmed Strobe Speed preview state
- kept the dimmed warning icon wired to the same flashing-light warning modal
- synced the dimmed Strobe Speed value with the selected/current Strobe Speed value
- reduced the visible Strobe Speed warning icon size while keeping its tap area stable
- fixed blurry dimmed Strobe Speed rendering by preventing the active slider from overlapping the preview slider
- moved the changing Strobe Speed value to the right side of the header immediately before the warning icon
- fixed the Strobe Speed warning modal title so it reliably appears on devices where the default dialog title was suppressed
- kept the Strobe Speed warning icon space stable across modes so switching modes no longer causes the layout to jump
- moved the Strobe Speed warning icon inward from the right edge so it has more breathing room near the slider
- kept the selected Auto-off value highlighted while the locked Auto-off section is dimmed
- restored the Strobe Speed warning modal title so the dialog shows both a bold title and content paragraph
- updated the warning title and message strings for clearer flashing-light sensitivity guidance
- reduced the visible Strobe Speed warning icon size while keeping the same tap area
- added a Strobe Speed warning icon that opens a simple flashing-light sensitivity warning modal
- added a local warning vector icon plus warning title and message strings for the modal
- dimmed the locked Auto-off section so disabled controls match the slider placeholder style