Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
a898fe4
feat: add status-bar-aware width support for island layout
sameerasw Nov 8, 2026
b4de6f3
feat: add debug UI margin overlay setting
sameerasw Nov 8, 2026
a8f929f
refactor: strict cap island width to statusbar items
sameerasw Nov 8, 2026
5de56fa
refactor: improve compact layout engine with slack, jitter filtering,…
sameerasw Nov 8, 2026
85437ac
feat: add setting to ignore notifications for status bar aware island…
sameerasw Nov 8, 2026
c1ee487
feat: add volume panel and navigation bar sections to status bar debu…
sameerasw Nov 8, 2026
fc4fe96
feat: add system UI component sections and shade tree debugging support
sameerasw Nov 8, 2026
f371e42
fix(island): animate outline stroke width during expand/collapse
isaacsa51 Nov 8, 2026
1e3cc53
Merge remote-tracking branch 'upstream/develop' into nit/island/anima…
isaacsa51 Nov 8, 2026
faae249
Merge remote-tracking branch 'upstream/develop' into nit/island/anima…
isaacsa51 Nov 10, 2026
ec9648d
fix(island): distribute compact cell widths evenly and restrict measu…
isaacsa51 Nov 12, 2026
6abdcb1
fix(island): distribute island taking media/live notification and nav…
sameerasw Nov 12, 2026
46dfdd9
fix(island): optimize particle rendering and power save handling
isaacsa51 Nov 10, 2026
2798723
feat(island): add battery limiter indicator
isaacsa51 Nov 10, 2026
a5f2fa4
fix(island): keep power save colour default, show shield only when ch…
sameerasw Nov 12, 2026
f011d34
fix(island): render missing battery status glyphs on battery icon (#1…
sameerasw Nov 12, 2026
7a73847
Merge branch 'develop' into nit/island/animate_outline_from_expanded
sameerasw Nov 12, 2026
d03c8dc
fix(island): animate outline stroke width during expand/collapse (#1683)
sameerasw Nov 12, 2026
8bde090
fix: freeze settings button overflow
sameerasw Nov 12, 2026
08b76ac
feat: add search for frozen apps activity
sameerasw Nov 12, 2026
1e22a82
feat: add backdrop blur availability checking
sameerasw Nov 12, 2026
af90665
Merge branch 'main' into develop
sameerasw Nov 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,7 @@
android:label="@string/freeze_shortcut_short_label"
android:launchMode="singleTask"
android:taskAffinity="com.sameerasw.essentials.freezing"
android:windowSoftInputMode="adjustResize"
android:theme="@style/Theme.Essentials" />

<activity-alias
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,9 @@ class TimeBatteryPlugin : BaseIslandPlugin() {
val timeText = time
val dayText = day
val batteryLevel = level
val isCharging = charging
val isSaving = powerSave
val isLimited = shielded
val stateColor = stateColor()
val displayColor = stateColor ?: idleColor()
val iconStyle = settings.getIslandBatteryStyle() == SettingsRepository.ISLAND_BATTERY_STYLE_ICON
Expand Down Expand Up @@ -303,7 +306,7 @@ class TimeBatteryPlugin : BaseIslandPlugin() {
compact = listOf(
CompactCell("battery") {
when {
iconStyle -> BatteryGlyph(batteryLevel, displayColor ?: islandAccent(), showLevel = showLevel)
iconStyle -> BatteryGlyph(batteryLevel, displayColor ?: islandAccent(), showLevel = showLevel, charging = isCharging, powerSave = isSaving, limited = isLimited)
else -> BatteryRing(batteryLevel, displayColor ?: islandAccent(), showLevel = showLevel)
}
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,20 @@ object CompactCellWidths {

fun record(cellKeys: List<String>, unitWidth: Int) {
if (cellKeys.isEmpty() || unitWidth <= 0) return
val previous = widths[cellKeys[0]]
if (previous != null && kotlin.math.abs(previous - unitWidth) <= JITTER_PX) return
widths[cellKeys[0]] = unitWidth
cellKeys.drop(1).forEach { widths[it] = 0 }
onChange?.invoke()
val n = cellKeys.size
val share = unitWidth / n
val remainder = unitWidth - share * n
val sorted = cellKeys.sorted()
var changed = false
sorted.forEachIndexed { i, key ->
val value = share + if (i == 0) remainder else 0
val previous = widths[key]
if (previous == null || kotlin.math.abs(previous - value) > JITTER_PX / n) {
widths[key] = value
changed = true
}
}
if (changed) onChange?.invoke()
}

fun get(cellKey: String): Int? = widths[cellKey]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,7 @@ fun CompactTemplate(
.height(spec.cellSize),
) { k ->
val unit = k?.let { known[it] }
val live = k != null && k == target
if (unit != null) {
val tap = Modifier.pointerInput(unit.itemKey) {
detectTapGestures(
Expand All @@ -219,7 +220,7 @@ fun CompactTemplate(
}
val measured = tap.clipToBounds().layout { measurable, c ->
val p = measurable.measure(c.copy(maxWidth = Constraints.Infinity))
com.sameerasw.essentials.island.state.CompactCellWidths.record(unit.cells.map { it.cell.key }, p.width)
if (live) com.sameerasw.essentials.island.state.CompactCellWidths.record(unit.cells.map { it.cell.key }, p.width)
val w = p.width.coerceIn(c.minWidth, c.maxWidth)
layout(w, p.height) { p.place(0, 0) }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.os.Build
import android.view.View
import android.view.WindowManager
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.runtime.Composable
Expand All @@ -15,7 +16,29 @@ import androidx.compose.ui.viewinterop.AndroidView
import kotlin.math.roundToInt

internal object IslandBackdropBlurSupport {
enum class Status { Available, UnsupportedOs, WindowBlurDisabled, ApiUnavailable }

val available: Boolean get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S

private val apiPresent: Boolean by lazy {
try {
Class.forName("android.view.ViewRootImpl").getMethod("createBackgroundBlurDrawable")
true
} catch (_: Throwable) {
false
}
}

fun windowBlurEnabled(context: Context): Boolean =
Build.VERSION.SDK_INT < Build.VERSION_CODES.S ||
runCatching { context.getSystemService(WindowManager::class.java).isCrossWindowBlurEnabled }.getOrDefault(true)

fun status(context: Context, windowBlurEnabled: Boolean = windowBlurEnabled(context)): Status = when {
!available -> Status.UnsupportedOs
!apiPresent -> Status.ApiUnavailable
!windowBlurEnabled -> Status.WindowBlurDisabled
else -> Status.Available
}
}

private class BackdropBlurView(context: Context) : View(context) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -264,14 +264,21 @@ private fun IslandRootContent(
}
val iconColor = if (justCollapsed) iconTarget else lerp(iconAnim.value, collapsedIconTarget, collapseMix)

val outlineAlphaTarget = if (spec.outlineHiddenWhenExpanded && stage == IslandStage.Expanded) 0f else 1f
val outlineHidden = spec.outlineHiddenWhenExpanded && stage == IslandStage.Expanded
val outlineAlphaTarget = if (outlineHidden) 0f else 1f
val outlineAlphaAnim = remember { Animatable(outlineAlphaTarget) }
LaunchedEffect(outlineAlphaTarget) {
if (justCollapsed) outlineAlphaAnim.snapTo(outlineAlphaTarget) else outlineAlphaAnim.animateTo(outlineAlphaTarget)
if (justCollapsed) {
outlineAlphaAnim.snapTo(outlineAlphaTarget)
} else {
outlineAlphaAnim.animateTo(outlineAlphaTarget, if (outlineHidden) IslandMotion.contentOut() else IslandMotion.contentIn())
}
}
// While collapsing from expanded, the outline draws back in over the second half of the shrink.
val outlineReveal = ((collapseMix - 0.5f) / 0.5f).coerceIn(0f, 1f)
val outlineAlpha = when {
justCollapsed -> outlineAlphaTarget
stage == IslandStage.Expanded -> outlineAlphaAnim.value + (1f - outlineAlphaAnim.value) * collapseMix
stage == IslandStage.Expanded -> outlineAlphaAnim.value + (1f - outlineAlphaAnim.value) * outlineReveal
else -> outlineAlphaAnim.value
}

Expand Down Expand Up @@ -1255,7 +1262,8 @@ private fun IslandRootContent(
}
.then(
outlineFor(1f - bond)
?.let { Modifier.border(spec.outlineThickness, it, surfaceShape) }
// The stroke draws in from hairline to full width as it fades in
?.let { Modifier.border(spec.outlineThickness * (0.35f + 0.65f * outlineAlpha), it, surfaceShape) }
?: Modifier,
)
// Finger-driven shrink sits inside the clip/background so the pill itself follows the drag.
Expand Down
Loading
Loading