Per-setting status of every crDroid Settings screen. Companion to ROM_CHANGELOG.md
(which is feature-oriented); this one is checklist-oriented for tracking what actually works.
Legend
- ✅ confirmed working on-device
- 🟡 works with caveats (see note)
- 🔧 backend implemented + builds, not yet confirmed on-device
- ❌ implemented but NOT working (bug)
- ⛔ no backend yet — the toggle persists but nothing reads it
- 🚫 blocked on A17 architecture (documented reason)
The vast majority of crDroid settings are currently ⛔: they save correctly (verified: the Settings.System / Secure / LineageSettings providers all persist), but no SystemUI/framework code reads them yet. Backends are being ported screen by screen. Only the items explicitly marked below have a backend.
- ✅
status_bar_clock_seconds— seconds in the clock (ROM default ON) - ✅
status_bar_clock_date_display— show date (gone/small/normal) - ✅
status_bar_clock_date_style— date case (regular/lower/upper) - ✅
status_bar_clock_date_position— date left/right of time - ✅
status_bar_clock_date_format— custom date format - ✅
status_bar_clock_period_separator—:→. - ✅
status_bar_clock_bold— bold clock - ✅
status_bar_am_pm— AM/PM style (normal/small/gone) - 🔧
status_bar_clock_auto_hide— hide clock after 5s (simplified timeout model; not the "hide while launcher visible" semantics) - ✅
status_bar_clock(position left/center/right) — verified on-device 2026-07-15: all three positions work — value 2 → clock top-left, 1 → top-center, 0 → top-right. Added center + right clock views; shows the selected one, respects DISABLE_CLOCK.
- ✅
status_bar_show_battery_percent— re-confirmed 2026-07-14: value1renders the percent ("85") inside the battery glyph in the status bar;0hides it. Backend (BatteryRepository → BatteryViewModel.BasedOnUserSetting) is correct end-to-end. The earlier "toggle is broken" report was the default being0(hidden) plus the crDroid-tab crash making the UI feel unstable — not a backend bug. 🟡 "2 next-to" maps to inside - 🟡
status_bar_battery_style— 0 portrait ✅, 2 text ✅ (note: text color is dim/uses the battery fill color — fix pending to use the status-bar foreground color); ❌ 1 circle / 3 dotted-circle do not work (unified Compose battery is a single rounded-rect path — no circle drawable; they fall back to portrait) - ⛔
status_bar_battery_text_charging— (pref is commented out in crDroidSettings anyway) - 🔧
batterybarsub-screen (statusbar_battery_bar*) — implemented 2026-07-15 (10 settings): newBatteryBarView(SystemUIstatusbar/BatteryBarView.java) drawn full-width along the bottom edge ofPhoneStatusBarView, added inStatusBarRoot.addCrDroidStatusBarViews. Backsstatusbar_battery_bar(enable),_thickness(dp),_style(regular/center-mirrored/reversed),_blend_color+_blend_color_reverse,_color,_battery_low_color,_animate,_enable_charging_color,_charging_color. Self-observes settings via TunerService (system:) and battery state via an ACTION_BATTERY_CHANGED receiver. ✅ verified on-device 2026-07-15: the bar renders full-width along the status-bar bottom edge, width tracks the level (~85%), amber charging color applied. (The A17 status bar is a realPhoneStatusBarView/FrameLayout hosted via ComposeAndroidView— only the start/end icon areas get Compose overlays — so a full-width bottom-edge bar renders fine. This unblocks the "new view" category.)
- ✅
double_tap_sleep_gesture— double-tap status bar to sleep (default ON) - 🔧
status_bar_brightness_control— swipe status bar to change brightness - 🚫
status_bar_brightness_control_lockscreen— separate keyguard status bar view on A17; not wired - 🔧
statusbar_extra_padding_start/_top/_end— extra status bar padding (start ✅ verified)
- 🔧
statusbar_notif_count— count badge on notif icons (only apps that set Notification.number) - 🔧
statusbar_colored_icons— colored (app-colored) status bar icons - ⛔
wifi_standard_icon— 🚫 blocked (A17 Compose wifi pipeline) - ⛔
bluetooth_show_battery— 🚫 blocked (no BT battery API in A17 icon pipeline) - ⛔
enable_camera_privacy_indicator/enable_location_privacy_indicator/enable_projection_privacy_indicator— needs PrivacyConfig gating (deferred; default ON)
- ⏸️
status_bar_logo(+_position,_style) — code + 33 drawables added; SystemUI stable (fixed an infinite-recursion boot crash), but the view does not render (A17 Compose start-side overlay covers it). Left in place, not actively being fixed — cosmetic polish. - ⏸️ network traffic (
network_traffic_*) — code present, does not render. Deferred to the very last batch at user's request (do not work on until told). Left untouched in the tree.
Roadmap priority (per user): make the ROM mostly usable first — functional/behavior settings — and leave cosmetic/niche features (logo, network traffic, battery bar, dynamic bar, custom clock styles) as the last bit of polish. Network traffic is explicitly the final batch.
- ⛔
lockscreen_show_carrier,lockscreen_show_custom_carrier_text - ⛔
qs_quick_pulldown,qs_smart_pulldown— 🚫 legacy shade path inert (scene_container on); to be re-done in the scene framework (in the Quick Settings batch)
- ✅ Classic (LegacyRecents) recents — pre-Quickstep vertical recents, works
- ✅
recents_typeselection infra (0 stock / 1 classic / 2 slim) — Classic verified - ⛔ Slim recents — no working modern source exists to port; not implemented (crDroidSettings has no slim screen; would be an IchthysOS addition)
- 🐛→🔧 Opening the Lock screen tab (and other tabs to the right) crashed the whole crDroid
UI. Root cause: the tabbed layout's ViewPager2 (
offscreenPageLimit = 1) preloads the adjacent Buttons tab (tab 3, next to Lock screen tab 2).ButtonBacklightBrightnessinflates in Buttons.onCreate and its constructor callsDeviceUtils.hasKeyboardBacklightSupport, which readsorg.lineageos.platform.internal.R.integer.config_deviceSupportsKeyboardBrightnessControl. The lineage-sdk resource package (id0x3f, installed to/system_ext/framework/) is not attached to the Settings app's runtime AssetManager, so everyorg.lineageos.platform.internal.R.*read throwsResources$NotFoundException→InflateException→ crash. crDroid's lineage classes (LineageSettings, LineageHardwareManager) work because they're linked vialibs; only the lineage resources are missing at runtime. Fix: added resilientDeviceUtils.getLineageInteger/Boolean/ Float(context, resId, default)helpers (try/catch → lineage-sdk config.xml defaults) and routed all 16 lineage-internal-R reads (DeviceUtils, ButtonBacklightBrightness, Buttons, Notifications) through them. On Cuttlefish the defaults (no hardware keys/backlight/LED) are the correct values. Reads ofcom.android.internal.R.*(framework, always loaded) were left as-is. Settings-only rebuild.
Tab now opens without crashing (see crash-fix section above). Verification 2026-07-15:
- ✅
lockscreen_battery_info— verified on-device: with a lock set, the keyguard indication text shows "Battery 85%". Works. - 🔧
double_tap_sleep_lockscreen— double-tap empty lockscreen to sleep (passive window-root detector; default off). Code confirmed correct (gated on KEYGUARD state + the setting, fed on the window-root touch dispatch before the scene-container branch). Could not verify via adb — two sequentialinput tapcalls are >300 ms apart (JVM spawn latency), so they never register as a GestureDetector double-tap. Needs a manual human double-tap to confirm. - 🔧
lockscreen_enable_power_menu— allow power menu on a secure lock screen (gated in PhoneWindowManager / system_server). Not yet verified (needs secure lock + long-press power). - 🔧
enable_ripple_effect— fingerprint/face unlock ripple animation toggle. Not yet verified (needs a biometric unlock event; Cuttlefish virtual fingerprint). - ⛔ custom keyguard clock styles, weather (needs OmniJaws), UDFPS (no HW on Cuttlefish), fp vibrate (fingerprint HAL), pulse/media-art — deferred/hard
All 🔧 above built clean (SystemUI + services); on-device verify pending. Framework (services) changes need a full image build (or services.jar push) to take effect — not just an APK push.
- ✅
disable_all_vibration(IchthysOS addition) — global master toggle that drops EVERY vibration (haptics/ring/notification/alarm/system) atVibrationSettings. Under Sound settings. Verified on-device: with it on, the vibrator history shows all hapticsignored_for_settings.
- ✅ Custom IchthysOS boot animation — user-provided frames repackaged into a valid stored
bootanimation.zip. Restructured 2026-07-15 (v2) into three parts around the true seamless loop. Frame analysis (RMSE): the fish is a turntable spin with an exact 29-frame period — frame 30 == frame 1 (RMSE 2.1), so frames 1–29 are the one perfect loop; the motion diverges after frame 30 (frame 44 ≠ 15) into the wind-down + morph.desc.txt:680 680 24/p 0 0 part0/c 1 0 part1/c 1 0 part2part0= frames 1–29 (seamless spin loop) —pcount 0, loops until boot completes.part1= frames 30–71 (transition out: finishes the spin + winds down to a flat side profile) —c(play-to-completion). Must flow through frame 30 (==frame 1) because cutting the loop straight to the wind-down (frame 29→59) is a hard pose jump (RMSE 4200).part2= frames 72–100 (morph → ICHTHYS symbol → "IchthysOS" text) —c.- (No "transition-in" part: the source opens already mid-spin at frame 1, which is the loop start.)
- Verified via live
bootanimpreview: fish loops; onservice.bootanim.exit=1it finishes the spin, winds down, and types out "IchthysOS", then exits. In the tree atdevice/google/cuttlefish/shared/phone/bootanimation.zip(shipped viaPRODUCT_COPY_FILESto/product/media/) and backed up to~/Downloads/IchthysOS-bootanimation-FIXED.zip.
- ✅ 24-hour time default (framework)
- ✅ Status-bar-seconds default ON
- ✅ Android 8.1-style collapsed QS (single row of icon tiles)
- ✅ QS brightness slider (thin + %)
- ⛔ everything else on this screen (qs_panel_style, tile shapes/animations, brightness slider position, header image, etc.) — no backend yet
- ✅ Horizontal 8.1-style volume dialog (step number, no ringer drawer, pitch-black + accent border, centered, white slider outline)
- ✅ Pitch-black mode (dark surfaces → pure black)
- ⛔ rest of monet_engine screen — no backend yet
crdroid_settings_lockscreen (+ lockscreen clock, media art, edge light, pulse, always-on-display,
doze) · crdroid_settings_ui (settings icons, gradient, dynamic bar) · crdroid_settings_notifications
(notification light, battery light) · crdroid_settings_sound (adaptive playback) ·
crdroid_settings_button (hardware keys, power menu) · crdroid_settings_misc (smart pixels,
sensor block, game spoofing, play integrity, tricky store) · crdroid_settings_about.
Last updated: 2026-07-14. Update per-item as backends are ported/verified.