Skip to content

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
sameerasw merged 34 commits into
mainfrom
develop
Nov 6, 2026

Conversation

@sameerasw

Copy link
Copy Markdown
Owner

Type of change

  • Bug fix
  • New feature
  • UI / visual update
  • Performance improvement
  • Refactoring / cleanup
  • Translations
  • Build / CI tooling

isaacsa51 and others added 30 commits October 23, 2026 22:34
…nce_shadow_pulse_position

# Conflicts:
#	app/src/main/java/com/sameerasw/essentials/island/ui/IslandRoot.kt
## 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_*`).
#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_*`).
sameerasw and others added 3 commits November 6, 2026 19:21
## 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_*`).
@sameerasw sameerasw self-assigned this Nov 6, 2026
@sameerasw sameerasw added bug Something isn't working enhancement New feature or request labels Nov 6, 2026
@sameerasw
sameerasw merged commit 15f53ed into main Nov 6, 2026
@github-project-automation github-project-automation Bot moved this from Backlog to Done in Essentials Progress Nov 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working enhancement New feature or request

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

4 participants