ShizuStore

Tideo Auto Brightness

faded-penguin021

1.12.0 · GitHub

Download APK
Display management Android 12+ 2 days ago MIT
88 ShizuStore
1.5k GitHub
46 Stars
24 MB Size

More about this app

Glass-box adaptive-brightness replacement with explainable decisions and circadian support.

Tideo Auto Brightness

Tideo Auto Brightness — the auto-brightness that shows its work

Build Release Downloads (GitHub) Stars License: MIT minSdk Kotlin Ko-fi

A glass-box replacement for Android's adaptive brightness. You taught Android your brightness preferences and it is still wrong. Tideo replaces the opaque on-device machine learning with deterministic, inspectable math: a tunable lux-to-brightness curve you can see and shape, smooth animated transitions, circadian (time-of-day) scaling, per-context overrides, and an optional privileged super dimming mode that allows the screen to go below the system minimum.

Tideo is a ground-up Kotlin/Compose rebuild of the Advanced Auto Brightness (AAB) Tasker project, ported to a native app with exact behavioural parity. The math and decision logic are golden-tested against a transcription of the original Tasker engine.

The Tasker project Advanced Auto Brightness is the upstream source of truth. Feature discussion, bug triage, and most contributions happen there. Please read Contributing.

Features

  • Three-zone perceptual brightness curve with a live, editable graph (low-light √, mid-range ∛-ish, high-light asymptotic tail. The curve is C0-continuous).
  • Automatic curve fitting when override detection is enabled on the Reactivity screen, adjusting brightness manually pauses the service and logs a data point. After >8 points across varied lighting conditions the wizard suggests a fitted curve.
  • Reactivity control sets sensor dead zones (dark / dim / bright) that allow balancing jitter with reactivity.
  • Smooth animated transitions with customization for animation duration and steps.
  • Circadian scaling shifts the whole curve brighter/dimmer based on local solar events (GPS, manual latitude/longitude or IP-geolocation fallback).
  • Super dimming (requires WRITE_SECURE_SETTINGS) can set brightness below the hardware floor and a PWM-flicker-aware software-dimming mode (locks hardware brightness to a user defined point and dims using Android's Extra Dim functionality).
  • Privileged display toggles (requires WRITE_SECURE_SETTINGS): Night Light with color temperature, grayscale / color correction, color inversion, always-on display, stay-awake while charging, and Disable HDR (experimental) on Android 14+. The HDR control changes stored format preferences rather than invoking Android’s Force-SDR service API; applying or clearing it may require a reboot, and display-mode changes may briefly blank the screen. Night Light and always-on display are shown only when Android reports those features available. Like super dimming, these are profile settings: loading a profile applies them, and returning to your baseline restores its values.
  • Profiles are stored settings. Tideo ships with five built-in presets.
  • Context automation can automatically load profiles based on: foreground app, time window, location, charging state, Wi-Fi SSID, or day of week, with priority-based conflict resolution.
  • Live Debug scene: a glass-box that shows relevant inputs and outputs.
  • Emergency recovery, a safety feature for when the screen is too dark, flip the phone upside-down and shake to force brightness to maximum. It also resets all supported privileged display toggles to their defaults.
  • Automation control (optional, off by default): an opt-in broadcast surface so apps like Tasker or MacroDroid can turn Tideo on/off, pause, reset, or load a profile, and react to its state changes. See Automation.

Tideo Dashboard
The Dashboard: applied brightness (55/255), the raw and smoothed ambient lux feeding it, the current circadian multiplier (1.15×), the active profile and context, and the master service toggle.

How it works

  • Three-zone model. Screen brightness is determined by a C0-continuous piecewise function. Each zone has its own formula and exposed settings. The graph below is live and and shows the curve based on the current setting, the reference, and the recorded overrides.
  • Curve fitting. With override detection on, your manual overrides become training points; the wizard under Tools fits the three-part function and reports extensive quality metrics.

Curve & Brightness editor
The Curve & Brightness editor: the teal line is the current lux-to-brightness curve, the dashed line is the static reference, and the red cross-hairs mark the live point (after scaling is applied): 416 lux mapping to brightness 86. The fields below are user definied zone scaling factors and zone boundaries.

  • Event-driven runtime. The app reacts to state changes (a light change beyond the sensor dead zone or rule-based, e.g. an app switch, a battery change, a location change). The event-driven architecture aims to minimize battery impact.
  • Context precedence. When multiple context rules match at once, highest priority wins. If priorities are equal the most specific rule wins.
  • Circadian scaling. A time-of-day multiplier follows your local sunrise/sunset (GPS, manual latitude/longitude, or IP fallback).

Circadian scaling editor
Circadian scaling across the day: the plateau shows the daytime scale, tapering toward dawn and dusk (the red line is now and the x-axis is in UTC). The settings below control shape of this graph. The location panel can be used to track a certain date and/or location.

Install

Get it on F-Droid

  1. Disable the system's stock Adaptive/Auto Brightness (Settings → Display).
  2. Install from F-Droid (recommended — automatic updates), or grab the APK directly from Releases. Both are the same APK: F-Droid rebuilds each tagged release from this repo's source, verifies it byte-for-byte against the published release APK, and distributes that binary with its original developer signature (a reproducible build — Binaries: + AllowedAPKSigningKeys in the F-Droid recipe). So the two sources are interchangeable: you can switch either way, or update from whichever is faster, with no uninstall and no loss of settings.
  3. Launch Tideo, complete onboarding (grant notifications + Modify system settings), and toggle the main service on from the Dashboard.

minSdk 31 (Android 12) · target/compile SDK 36.

Tideo settings home
Once installed and permissions are granted, everything can be accessed from the home Menu.

Privilege tiers

Tideo uses two privilege tiers. The core functionalities only require BASIC privilege.

Tier Permission Unlocks
BASIC WRITE_SETTINGS (user-grantable, in-app) Curve, animation, reactivity, circadian, contexts
ELEVATED WRITE_SECURE_SETTINGS (one-time pm grant) Super dimming (Reduce Bright Colors below the floor) + supported Privileged Display profile toggles (Night Light, color correction/inversion, AOD, stay-awake)

Granting ELEVATED privilege

  • ADB:
adb shell pm grant com.tideo.autobrightness android.permission.WRITE_SECURE_SETTINGS
  • Shizuku: start the Shizuku app, then use the one-tap grant in Tideo's onboarding (Elevated step).
  • Root: Tideo can run the same pm grant via su from the onboarding screen.

After the grant, Tideo writes the secure setting directly (no Shizuku binder needed for dimming). The grant is detected the next time the screen turns on or when the app is opened.

Three runtime uses of Shizuku. Beyond the one-time grant, Shizuku is used at runtime in exactly three optional places, all through Shizuku's shell (with a root fallback): the no-Location Wi-Fi SSID context runs cmd wifi status so Wi-Fi-based context rules can read the SSID without the Location permission, the global force-dark toggle sets the debug.hwui.force_dark system property (which isn't reachable through secure settings), and the Night Light temperature is also sent to the display service on devices (such as OxygenOS) that ignore the temperature setting — only once Tideo has seen the device ignore it.

Troubleshooting

  • Stuck on a black/too-dark screen? Flip the phone upside-down (charging port up) and shake it. The phone will emit an SOS vibration, force brightness to maximum, and reset supported privileged display toggles to defaults.
  • Service stops adapting after a while. Aggressive OEM battery management may kill the foreground service. Exempt Tideo from battery optimization. Please see dontkillmyapp.com for device-specific steps.
  • Super dimming doesn't visibly darken on some OEMs. A few vendors rename or relocate the reduce_bright_colors secure keys. That is not a Tideo bug. Enable Live Debug (debug level: Super Dimming Info) to see when it's on.
  • A Settings key is not proof that a display feature is supported. Tideo reproduces Android's framework capability gates before exposing or writing Night Light and always-on display. Some supported OEM implementations can still ignore Night Light temperature changes.
  • Brightness range looks off. Tideo normalizes the device's brightness range to a 0–255 scale. Some OEMs use different scales. The mapping is detected from config_screenBrightnessSettingMaximum.
  • Context rules not firing. For per-app rules, grant Usage Access when prompted; for location/Wi-Fi rules, grant and enable Location (unless you run Shizuku). Live Debug (set to Context Automation) shows the active context and any priority conflicts. Please note that this requires the Global Flashes to be enabled.

Privacy

Tideo is local first and has no analytics, ads, or accounts. It makes one outbound network request, and only as a last resort:

  • IP-geolocation fallback (optional, off by default, HTTPS). Circadian scaling needs an approximate location to compute local sunrise/sunset. Tideo tries, in order: a fixed latitude/longitude you pin → the device's last-known location → a fresh GPS/network fix. Only if all of those are unavailable does it fall back to a single GET https://ipwho.is/ (HTTPS), disclosing your public IP to that third party so it can estimate your city. You can turn it off under Circadian → Date & location → "IP-based location fallback", and it is off until you opt in. When it is off, Tideo never contacts ipwho.is. Automatic acquisition is attempted at most once per day; successful approximate coordinates are stored only in the app's on-device preferences so circadian state survives a restart. The same opt-in fallback also backs the Circadian "Use current location" button when no on-device fix is available; each user tap can make one additional request.

Everything else runs entirely on-device.

Automation (Tasker / MacroDroid)

Tideo can be driven by automation apps through an opt-in broadcast surface: commands to turn the service on/off, pause/resume, reapply, reset, or load a profile, plus outbound state-change events so your macros can react to Tideo. It is off until you enable it under Tools → Automation control (there is no password, so any app can send commands while it is on).

See docs/AUTOMATION.md for the full list of actions, the profile-name extra, the outbound STATE_CHANGED event, and adb/Tasker/MacroDroid examples.

Module layout

A 3-module Gradle build:

  • :domain: pure JVM/Kotlin. All brightness math and decision logic (smoothing, curve mapping, thresholds, animation, circadian scale, context resolution). No Android dependencies.
  • :platform: Android library. Real system adapters behind small interfaces: light sensor, brightness writer (OEM-range normalization), secure-dimming writer, tiered privilege manager, brightness-override observer, and battery/Wi-Fi/location/foreground-app readers.
  • :app: Compose Material 3 UI, DataStore settings, the foreground monitoring service, a Quick Settings tile, a home-screen widget, a boot receiver, and interactive notification.

Building

Requires JDK 21+ (the toolchain targets 21) and the Android SDK (local.properties with sdk.dir, or run scripts/setup-android-sdk.sh).

./gradlew :domain:test              # pure-JVM engine + golden parity tests
./gradlew :platform:test            # Robolectric adapter tests
./gradlew :app:testDebugUnitTest    # app unit + Robolectric tests
./gradlew :app:assembleDebug        # debug APK → app/build/outputs/apk/debug/
./gradlew build                     # everything: all modules, all tests, lint

Project docs

The rebuild is complete. Maintenance is driven by these documents:

Contributing

Tideo is the build artifact; the Advanced Auto Brightness Tasker project is where the brightness math and feature direction live.

  • App-layer / Android-Kotlin bug fixes are welcome here as pull requests, e.g. crashes, OEM brightness/secure-key quirks, battery-saver kills, Compose/UI leaks, packaging.
  • Translations are welcome here — the UI is fully localizable. Human translations only (no machine/AI). See CONTRIBUTING.md for how to add a values-<lang>/strings.xml.
  • Features and brightness-logic changes go to AAB: Please open an issue there first.

See CONTRIBUTING.md and the Bug report issue template.

Credits

  • Tasker developed by João Dias (AAB was built in Tasker and was ported over into Tideo. Tideo is not affiliated with Tasker).

License

MIT © 2026 /u/v_uurtjevragen.

Close

How Shizuku is used

Can unlock elevated display features and use Wi-Fi rules plus force-dark and Night Light control via Shizuku with `pm grant`, `cmd wifi status` and color display service

This is an AI-assisted analysis of Shizuku-related usages in the app's public source code. It is best effort, so it may not catch every single usage.

How this app uses Shizuku

Tideo uses Shizuku for one time elevated access and for privileged reads and writes that support brightness automation and display tools.

  • Unlock elevated display features: grants its own WRITE_SECURE_SETTINGS permission with the pm grant shell command through Shizuku, which unlocks super dimming below the hardware brightness floor and privileged display profile toggles such as Night Light, color correction and inversion, always-on display and stay-awake while charging.
  • Use Wi-Fi in brightness rules: reads the connected Wi-Fi network name without requiring Location permission with the cmd wifi status shell command through Shizuku, used to match per-Wi-Fi context rules for automatic brightness profiles.
  • Control force-dark rendering: reads the system force-dark flag with getprop and turns system-wide forced dark rendering on or off with setprop through Shizuku, available as a tools toggle that darkens apps without their own dark theme and is reapplied after reboot.
  • Adjust Night Light temperature: reads and sets the Night Light color temperature in Kelvin through Shizuku using the system color display service, used for circadian and profile based Night Light control.

Android APIs or commands used

  • pm grant
  • cmd wifi status
  • getprop
  • setprop
  • IColorDisplayManager.getNightDisplayColorTemperature
  • IColorDisplayManager.setNightDisplayColorTemperature

Notable details

The same elevated access can be granted without Shizuku with the shown ADB pm grant command. Wi-Fi name detection and force-dark control also try non-Shizuku methods when Shizuku is unavailable.

Close

Changelog

What's new for version 1.12.0

What's new

The manual-override notification has a Discard button: if you moved the brightness slider by accident, tap it to forget that adjustment and resume, without touching your other curve points. While it is offered, Discard takes the place of Reset. Brightness curve values beyond the old limits, such as those from Curve Suggestion, are no longer reset when you save a profile or the app restarts.

What's Changed

Full Changelog: https://github.com/faded-penguin021/Tideo-Auto-Brightness/compare/v1.11.0...v1.12.0

Close

Permissions

17 permissions requested

  • android.permission.WRITE_SETTINGS
  • android.permission.WRITE_SECURE_SETTINGS
  • android.permission.POST_NOTIFICATIONS
  • android.permission.FOREGROUND_SERVICE
  • android.permission.FOREGROUND_SERVICE_SPECIAL_USE
  • android.permission.RECEIVE_BOOT_COMPLETED
  • android.permission.PACKAGE_USAGE_STATS
  • android.permission.ACCESS_COARSE_LOCATION
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.ACCESS_BACKGROUND_LOCATION
  • android.permission.VIBRATE
  • android.permission.INTERNET
  • android.permission.ACCESS_NETWORK_STATE
  • android.permission.DUMP
  • android.permission.WAKE_LOCK
  • com.tideo.autobrightness.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION
  • moe.shizuku.manager.permission.API_V23
Close