Repository navigation
Develop - island: pulse shadow update, sound mode gesture silent support, rtl, optional album art color, hide media in player app, open clock, per app themed colors, time left in alarm, peek plugin on update, fix 5g state and icon color, nav icon color fix, DIY: battery level, fix unsupport feature sheet and more - #1672
Merged
Conversation
…nce_shadow_pulse_position # Conflicts: # app/src/main/java/com/sameerasw/essentials/island/ui/IslandRoot.kt
…on accessibility service
## Description <!-- Describe what this PR changes and why. If it resolves an issue, link it here: e.g. Closes #123 --> Small feature, be able to open the clock if the user taps on the clock from the island directly. ## Type of change - [ ] Bug fix - [x] New feature - [ ] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes <!-- Required if this PR changes or adds UI. Please attach screenshots or a screen recording. --> Toggle under the Time sheet of settings. https://github.com/user-attachments/assets/88009ab1-1ef2-43f7-b83a-3954cd645913 ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - [x] New preferences use `SettingsRepository` for keys and getter/setter methods. - [x] New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. - [x] New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - [x] Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`).
Adds a Battery level trigger and state in Battery & Power, built on a generic SystemMetric condition with numeric operators and a pure SystemMetricTracker (de-dupe, edge triggering, hysteresis, hold, cooldown, loop breaker, baseline) that guarantees every opened state closes. Open states and loop-breaker pauses live in diy_runtime_prefs, which is not exported. PowerModule forwards battery level only when the percent changes. The old Battery level state tile is replaced; saved BatteryLevel automations keep running and convert when edited, and disabling or deleting an open one now runs its exit actions. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
## Description First step of **System metrics**, as discussed: DIY automations can now react when the battery level meets a numeric condition, as a **Trigger** (one-shot) or a **State** (entry and exit actions). Each metric gets its own tile in its domain section: Battery level sits in Battery & Power in both lists. Later metrics (volume, temperatures, Wi-Fi/BT battery) only add a source, an enum entry and a tile in their own section. - **Per-domain, no new module.** Battery level lives in `PowerModule`. The shared logic is a plain, pure-Kotlin `SystemMetricTracker` that each module holds, with unit tests. - **Operators:** above, at least, below, at most, equals, not equal, between, outside (triggers and states); rises above, falls below, changes by, increases by, decreases by (triggers only). - **No loops or flapping:** event-driven only (no polling), duplicate readings ignored, edge-triggered, a hysteresis margin (default 2%) so 79↔80 jitter can't flap, optional "stay true for" hold, cooldown for triggers (default 60 s, minimum 5 s), and no trigger fires on the first reading. - **Loop breaker:** more than 5 fires/entries in 60 s turns the automation off and posts a notification with a **Re-enable** button (non-exported receiver, immutable PendingIntent). The row says "Paused: kept triggering itself" until it's turned back on. - **Every opened state closes:** the value moving out of range, disabling, deleting, editing the condition, the module stopping and the loop breaker all run exit actions exactly once. Open states are persisted so they survive process death and reboots without running entry actions twice. - **Replaces the old Battery level state tile** (one Battery level tile per list now). Saved Battery level states keep loading and running unchanged; opening one shows the new tile with the same range, and saving converts it without re-running any actions. This also fixes a bug: disabling or deleting an active Battery level state never ran its exit actions. - **`ACTION_BATTERY_CHANGED` filtering:** only integer-percent changes reach the tracker, so temperature/voltage/status broadcasts (and charge-limit status flapping) are ignored. - **Export/import:** automations export as before. Open states and the paused flag live in a new `diy_runtime_prefs` file that's deliberately left out of export and backup (it describes this device's current state, like `battery_history_points`). After an import, changed states close and imported ones are re-checked against the current level. ## Type of change - [x] Bug fix - [x] New feature - [ ] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes A Battery level tile in Battery & Power in both the trigger and state lists (replacing the old state-only tile). Its sheet has a live "Now: 64%" reading, operator chips (state-only operators for states), a slider or range slider, and a collapsed Advanced section (stay true for, margin, and cooldown for triggers). Rows show a summary like "Battery level at most 20%". <!-- 0_state_list_battery_level.png --> <img width="1344" height="2992" alt="0_state_list_battery_level" src="https://github.com/user-attachments/assets/b7de195c-a1f8-45af-8c5e-de4639b7db8a" /> State list: one Battery level tile in Battery & Power <!-- 0b_trigger_list_battery_level.png --> <img width="1344" height="2992" alt="0b_trigger_list_battery_level" src="https://github.com/user-attachments/assets/c48c0036-abc0-43aa-98d2-c8f0c54cd646" /> Trigger list <!-- 1_battery_level_sheet.png --> <img width="1344" height="2992" alt="1_battery_level_sheet" src="https://github.com/user-attachments/assets/aa155f86-0e33-4875-8649-766edb6a73ec" /> Battery level sheet for a state (an old Battery level state opened, range kept) <!-- 1b_battery_level_trigger_sheet.png --> <img width="1344" height="2992" alt="1b_battery_level_trigger_sheet" src="https://github.com/user-attachments/assets/62521cee-e2c6-469a-80a6-2b0fe87c9b8b" /> Battery level sheet for a trigger <!-- 2_loop_breaker_notification.png --> <img width="1344" height="2992" alt="2_loop_breaker_notification" src="https://github.com/user-attachments/assets/5e20facc-be76-4d99-84d0-39b6a863400b" /> Loop breaker notification with Re-enable <!-- 3_rows_and_paused.png --> <img width="1344" height="2992" alt="3_rows_and_paused" src="https://github.com/user-attachments/assets/053077b6-1129-4a76-b202-7b41e6f01326" /> Row summaries, and a row paused by the loop breaker ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - [x] New preferences use `SettingsRepository` for keys and getter/setter methods. (No user settings. Runtime DIY state uses its own `diy_runtime_prefs` file next to `diy_automations_prefs`, so it stays out of export.) - [ ] New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. (N/A, no new settings.) - [x] New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - [x] Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`). Tested on a Pixel emulator with `dumpsys battery`: a simulated charge limiter flapping 79↔80% with status and temperature changes for a minute fired nothing; triggers fire once and re-arm past the margin; the loop breaker trips on the 6th fire, Re-enable restores it and it trips again; disabling or deleting an active state (new and old Battery level) runs its exit actions; an old Battery level state converts on save without running actions; after a reboot or force-stop, active states stay active without re-running entry actions, and ones that became false exit; export, edit, import closes and re-opens states correctly. Release APK +36 KB, no dependency changes. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
) ## Description <!-- Describe what this PR changes and why. If it resolves an issue, link it here: e.g. Closes #123 --> Since v20.2-beta.1 now we have the option of: **Use themed app icons** which renders the icon on a black background using the primary color of the island to tint them. | Option OFF | Option ON | |-----------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | <img width="620" height="90" alt="image" src="https://github.com/user-attachments/assets/1f85064b-078c-4460-970d-20b3ea120439" /> | <img width="623" height="86" alt="image" src="https://github.com/user-attachments/assets/bf7c8dc4-a2ef-4fd4-b286-6441d5bbdd2d" /> | with the new toggle instead of rendering the overlap/stacked notification icons, this renders using as background the app color primary color and proper contrast. | Option OFF | Option ON | |-----------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------| | <img width="569" height="83" alt="image" src="https://github.com/user-attachments/assets/313a5523-8277-4910-83b7-d1450ac8ba69" /> | <img width="565" height="81" alt="image" src="https://github.com/user-attachments/assets/b52dd8fd-77f1-45be-8784-80ac0b00edf2" /> | This takes the existing code from the **Use themed app icons** to render the icon accordingly if it has a monochrome icon or not, have tested and seems like all icons are showing as expected, system settings renders the material you theme from the phone with a black icon to handle the correct contrast. ## Type of change - [ ] Bug fix - [x] New feature - [ ] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes Option lives under the notification hud sheet: <img width="575" height="979" alt="image" src="https://github.com/user-attachments/assets/fdc8f703-8e7b-4ab8-a264-f712c57ab39d" /> Once enabled the chat pictures toggle gets disabled since it's unnecessary: <img width="572" height="973" alt="image" src="https://github.com/user-attachments/assets/cca8c1f2-4f47-431c-827e-b1b8daebadde" /> If the user turns off the **Use themed app icons**, user get the option disabled with the label on why: <img width="575" height="167" alt="image" src="https://github.com/user-attachments/assets/1c076f96-df62-4a2c-9a62-a6028419e62a" /> ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - [x] New preferences use `SettingsRepository` for keys and getter/setter methods. - [x] New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. - [x] New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - [x] Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`).
## Description <!-- Describe what this PR changes and why. If it resolves an issue, link it here: e.g. Closes #123 --> Change how the shadow pulse renders behind the island, this PR fixes and enhances how this render on the island. Now it renders an "outline" with the blur specified to the setting, also now featuring a new option of opacity if the user needs a more pronounced or not shadow. ## Type of change - [ ] Bug fix - [ ] New feature - [x] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes <!-- Required if this PR changes or adds UI. Please attach screenshots or a screen recording. --> https://github.com/user-attachments/assets/b62e39a4-402c-4d40-a541-2b85c79fa805 ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - [x] New preferences use `SettingsRepository` for keys and getter/setter methods. - [x] New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. - [x] New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - [x] Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`).
) ## Description <!-- Describe what this PR changes and why. If it resolves an issue, link it here: e.g. Closes #123 --> Request from #1559 From the plugin add new settings under the alarm toggle to show time remaining or just hide the content and only show icon: hide time option: <img width="559" height="64" alt="Image" src="https://github.com/user-attachments/assets/81f205f2-0fa6-4619-acbf-6d8cbb8f6055" /> showing time remaining: <img width="562" height="76" alt="Image" src="https://github.com/user-attachments/assets/be56a7f1-11d3-41c5-8089-85d4dd776b43" /> show upcoming alarm on expanded brief: <img width="560" height="199" alt="Image" src="https://github.com/user-attachments/assets/dc592996-7662-4dd2-a625-a4447797f9b8" /> notification expanded: <img width="568" height="195" alt="Image" src="https://github.com/user-attachments/assets/69bd4536-95c9-40f7-89e8-01794d114ad8" /> ## Type of change - [ ] Bug fix - [x] New feature - [x] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes <!-- Required if this PR changes or adds UI. Please attach screenshots or a screen recording. --> <img width="593" height="585" alt="image" src="https://github.com/user-attachments/assets/c55c38c6-f74c-4997-af32-aedc1116dcd6" /> ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - [x] New preferences use `SettingsRepository` for keys and getter/setter methods. - [x] New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. - [x] New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - [x] Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`).
…and (#1566) ## Description <!-- Describe what this PR changes and why. If it resolves an issue, link it here: e.g. Closes #123 --> ### Feature requested on: #1518 Enable the island to only show weather as a peek on every update from Overcast app. Toggle leaves under the sheet with the default options, comes OFF by default: <img width="574" height="487" alt="image" src="https://github.com/user-attachments/assets/2c339096-f7cb-4bac-b9d3-cd539b918431" /> ## Type of change - [ ] Bug fix - [x] New feature - [x] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes <!-- Required if this PR changes or adds UI. Please attach screenshots or a screen recording. --> _Forcing an update from brief, overcast connection will trigger the peek preview of it since the value changed:_ https://github.com/user-attachments/assets/bce1e3e7-af5e-49ec-a305-2f0893d37662 ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - [x] New preferences use `SettingsRepository` for keys and getter/setter methods. - [ ] New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. - [ ] New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - [ ] Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`).
…n connected to 5G.
#1649) ## Description This fixes the bug where no 5G icon was appearing at all. It accidentally fixed the bug where the WiFi strength was showing "always full strength" while a VPN was connected too. It seems like the problem is with 5G (NSA [non-standalone]). dataNetworkType on 5G NSA does NOT return NETWORK_TYPE_NR, instead it returns NETWORK_TYPE_UNKNOWN (0) or an unmapped value (null -> NetworkType.NETWORK_OTHER. Meanwhile, Android's real 5G NSA indicator is delivered via TelephonyDisplayInfo.getOverrideNetworkType() (OVERRIDE_NETWORK_TYPE_NR_NSA = 3 or OVERRIDE_NETWORK_TYPE_NR_ADVANCED = 5), which SignalPlugin completely ignores. Please check the code doubble, for me it looked fine but I'm starting to learn and Antigravity was helping a lot. ## Type of change - [x] Bug fix - [ ] New feature - [ ] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes <!-- Required if this PR changes or adds UI. Please attach screenshots or a screen recording. --> ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - [ not needed ] New preferences use `SettingsRepository` for keys and getter/setter methods. - [ not needed ] New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. - [ not needed ] New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - [ not needed ] Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`).
## Description <!-- Describe what this PR changes and why. If it resolves an issue, link it here: e.g. Closes #123 --> Small issue encountered on the new 20.1-beta.1 with the new chip mode on island. Navigation icon lighter phone theme, the icon is "missing" The chip color and the icon blends together with the low contrast. This PR fixes it. ## Type of change - [x] Bug fix - [ ] New feature - [ ] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes <!-- Required if this PR changes or adds UI. Please attach screenshots or a screen recording. --> Reproducible error: <img width="573" height="73" alt="image" src="https://github.com/user-attachments/assets/6f401dca-c17e-4494-9347-ce701add55e0" /> Correct color usage: <img width="569" height="252" alt="map" src="https://github.com/user-attachments/assets/b1affcb5-d05d-429a-861a-4b7e18919578" /> ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). ~~New preferences use `SettingsRepository` for keys and getter/setter methods~~ ~~New user-facing settings are registered in `FeatureRegistry.kt` for search indexing~~ ~~New UI follows the design system in ui/core/ (RoundedCardContainer, IconToggleItem, etc.)~~ ~~Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`)~~
## Description <!-- Describe what this PR changes and why. If it resolves an issue, link it here: e.g. Closes #123 --> **Small quick fix, just pass the color for the text network label when recomposes.** ## Type of change - [x] Bug fix - [ ] New feature - [ ] UI / visual update - [ ] Performance improvement - [ ] Refactoring / cleanup - [ ] Translations - [ ] Build / CI tooling ## UI changes <!-- Required if this PR changes or adds UI. Please attach screenshots or a screen recording. --> With bug: https://github.com/user-attachments/assets/c9c26eff-2009-485d-a861-173a4cf9b43b Current changes with the fix: https://github.com/user-attachments/assets/81152ea5-b9f6-458d-9339-f0812e982ad3 ## Checklist Before submitting, please make sure: - [x] The base branch is set to `develop` (not `main`). - [x] The app builds cleanly locally with `./gradlew assembleDebug`. - [x] Unit tests pass with `./gradlew testDebugUnitTest`. - [x] You tested the changes on a device or emulator (including Shizuku or Root if applicable). - **N/A** New preferences use `SettingsRepository` for keys and getter/setter methods. - **N/A** New user-facing settings are registered in `FeatureRegistry.kt` for search indexing. - **N/A** New UI follows the design system in `ui/core/` (`RoundedCardContainer`, `IconToggleItem`, etc.). - **N/A** Strings are added to `res/values/strings.xml` and drawables use rounded variants (`R.drawable.rounded_*`).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Type of change