Skip to content

feat(mobile): low battery motion mode - #5899

Merged
iscekic merged 2 commits into
mainfrom
kwf/surface-the-mobile-app-apps--c106
Sep 7, 2026
Merged

iscekic merged 2 commits into
mainfrom
kwf/surface-the-mobile-app-apps--c106

Conversation

@iscekic

@iscekic iscekic commented Sep 5, 2026 •

Copy link
Copy Markdown
Collaborator

Request

Surface: the mobile app (apps/mobile), android only.

Add a low battery mode to the mobile app. When the device battery level drops
under 20 percent and the device is not charging, the app reduces animation:
no looping or decorative animation runs, and a transition that remains is a
plain fade at most. When the level rises above 20 percent or the device
charges, the app restores the normal animation.

Verify it live on the android emulator. Set the level with the emulator's own
battery control, then capture the list surface and a job in progress at 15
percent and again at 80 percent. The captures must show the animation state,
so include the video of the in-progress row in both states.

Changelog for users

  • On Android, when the battery level drops below 20 percent while the device is not charging, the app enters a low battery mode that suppresses looping and decorative animation: spinners, skeleton shimmer, pulsing status dots, breathing avatars, and spinning icons render static, and any remaining transition is at most a plain fade.
  • When the battery level rises above 20 percent or the device starts charging, normal animation resumes without restarting the app, navigating away, or moving the surrounding content.
  • The pull-to-refresh spinner is replaced by a single static progress glyph while low battery mode is active.
  • The empty Agents list button now reads New session instead of New coding task.

Changelog for maintainers

  • A new MotionProvider wraps the app root and combines the system Reduce Motion setting with an Android-only battery policy: battery level below 20% and unplugged/not-charging forces reducedMotion on and switches Reanimated's global ReducedMotionConfig to Always; otherwise it stays System.
  • The old useMotionPolicy (a thin wrapper over useReducedMotion) is replaced by a context-backed hook plus useProvidedMotionPolicy; every animation primitive (Skeleton, SpinningIcon, StatusDot, the provisioning avatar pulse, splash overlay, composer, and entrance selectors) now reads the shared policy instead of useReducedMotion.
  • New activity-indicator, refresh-control, and refresh-progress primitives render the static equivalents under reduced motion; all in-app ActivityIndicator/RefreshControl imports are routed through them, with RefreshProgress added as a list header and to scroll containers so the static glyph stays stable.
  • The RefreshControl wrapper forces refreshing to false under reduced motion (suppressing the native spinner) while RefreshProgress renders the static glyph, so pull-to-refresh presentation changes only when motion is reduced.
  • expo-battery is added as a dependency.
  • The live-sync refresh contract now returns a canceled flag when the owner detaches mid-refresh, and callers fall back to a second refetch instead of treating a detached owner result as handled; focus/foreground refresh now relies on the live-sync owner rather than separately invalidating the active-sessions query.
  • Review focus: lib/a11y/motion.tsx and the root _layout.tsx provider for the policy/threshold logic, and the three new ui primitives for the static swap; the highest-risk area is the global ReducedMotionConfig mode switch and the native refresh spinner suppression.

E2E proof

Recording of the verified flow (waits trimmed)

e3-android-pagination-refresh.mp4.trim.mp4

[e1] At 15% unplugged, cause a retryable list failure and reconnect; expect the existing error text, Retry, retained content, and no animated progress loop. — e2e-mobile-app/e1-error-retry.png

[e1] At 15% unplugged, cause a retryable list failure and reconnect; expect the existing error text, Retry, retained content, and no animated progress loop. — e2e-mobile-app/e1-error-retry-300ms.png

[e2] Retryable unhappy: Unknown to Discharging at 15 percent — e2e-mobile-app/e2-unknown-refresh-a.png

[e2] Retryable unhappy: Unknown to Discharging at 15 percent — e2e-mobile-app/e2-unknown-refresh-b.png

[e3] Empty — not applicable: The battery policy has no collection. Verify that no low-battery empty surface or CTA appears. — e2e-mobile-app/e3-no-empty.png

Follow-ups (not changed here)

  • Agents — The retained row moved after refresh recovery (e11-ux-audit.png).

Comment thread apps/mobile/src/components/ui/refresh-progress.tsx Outdated
@kilo-code-bot

kilo-code-bot Bot commented Sep 5, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 2 Issues Found | Recommendation: Address before merge

Executive Summary

RefreshProgress still participates in parent gap at h-0, adding extra top spacing on pull-to-refresh screens for all users; reduced-motion ActivityIndicator also drops to an uncolored Lucide icon on dark surfaces.

Overview

Severity Count
CRITICAL 0
WARNING 2
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
apps/mobile/src/components/ui/refresh-progress.tsx 19 h-0 slot still consumes parent gap
apps/mobile/src/components/ui/activity-indicator.tsx 47 Static Loader2 has no default color
Files Reviewed (24 files)
  • apps/mobile/src/components/ui/refresh-progress.tsx - 1 issue
  • apps/mobile/src/components/ui/activity-indicator.tsx - 1 issue
  • apps/mobile/src/lib/a11y/motion.tsx
  • apps/mobile/src/lib/a11y/motion-context.ts
  • apps/mobile/src/lib/a11y/motion.mounted.test.tsx
  • apps/mobile/src/app/_layout.tsx
  • apps/mobile/src/components/ui/refresh-control.tsx
  • apps/mobile/src/components/ui/skeleton.tsx
  • apps/mobile/src/components/ui/spinning-icon.tsx
  • apps/mobile/src/components/ui/status-dot.tsx
  • apps/mobile/src/components/ui/motion-primitives.mounted.test.tsx
  • apps/mobile/src/components/tab-screen.tsx
  • apps/mobile/src/components/tab-screen.mounted.test.tsx
  • apps/mobile/src/components/detail-screen.tsx
  • apps/mobile/src/components/centered-state.tsx
  • apps/mobile/src/lib/active-sessions-live-sync.ts
  • apps/mobile/src/lib/active-sessions-live-sync-mount.tsx
  • apps/mobile/src/lib/active-sessions-live-sync.race.test.ts
  • apps/mobile/src/lib/hooks/use-agent-sessions.combined.mounted.test.tsx
  • apps/mobile/src/components/kiloclaw/instance-list-screen.tsx
  • apps/mobile/src/components/security-agent/dashboard-screen.tsx
  • apps/mobile/src/components/agents/file-part-renderer.tsx
  • apps/mobile/src/components/quick-chat/quick-chat-screen.tsx
  • apps/mobile/package.json

Fix these issues in Kilo Cloud

Previous Review Summaries (5 snapshots, latest commit d64b7eb)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit d64b7eb)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Incremental review of the cross-platform battery policy and i18n key splits at d64b7eb; no new correctness, security, or runtime issues.

Files Reviewed (14 files)
  • apps/mobile/src/lib/a11y/motion.tsx
  • apps/mobile/src/lib/a11y/motion.mounted.test.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/kiloclaw/status-badge.tsx
  • apps/mobile/src/components/kiloclaw/status-label-case.mounted.test.tsx
  • apps/mobile/src/components/organization/credit-activity-screen.tsx
  • apps/mobile/src/components/organization/credit-activity-screen.mounted.test.tsx
  • apps/mobile/src/components/organization/invoices-screen.tsx
  • apps/mobile/src/components/organization/invoices-screen.mounted.test.tsx
  • apps/mobile/src/components/profile-screen.tsx
  • apps/mobile/src/i18n/label-reference.test.ts
  • apps/mobile/src/i18n/locales/en.json
  • apps/mobile/src/lib/hooks/use-settings-back-guard.ts
  • apps/mobile/src/lib/hooks/use-settings-back-guard.mounted.test.tsx

Previous review (commit 8467ebf)

Status: No Issues Found | Recommendation: Merge

Executive Summary

No incremental code changes since the previous review; HEAD matches the previously reviewed tree after a history rewrite.

Files Reviewed (0 files)

Previous review (commit 9c86be2)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (24 files)
  • apps/mobile/src/app/(app)/(tabs)/(1_kiloclaw)/index.tsx
  • apps/mobile/src/app/(app)/kiloclaw/[instance-id]/billing.tsx
  • apps/mobile/src/app/_layout.tsx
  • apps/mobile/src/components/agents/file-part-preview.ts
  • apps/mobile/src/components/agents/file-part-renderer.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/tool-card-file-attachments.tsx
  • apps/mobile/src/components/code-reviewer/review-detail-screen.tsx
  • apps/mobile/src/components/kilo-chat/message-reaction-picker-sheet.tsx
  • apps/mobile/src/components/kiloclaw/access-required-screen.tsx
  • apps/mobile/src/components/kiloclaw/instance-card.tsx
  • apps/mobile/src/components/kiloclaw/status-badge.tsx
  • apps/mobile/src/components/kiloclaw/status-card.tsx
  • apps/mobile/src/components/organization/credit-activity-screen.tsx
  • apps/mobile/src/components/organization/invoices-screen.tsx
  • apps/mobile/src/components/pr-review/discussion/discussion-thread.tsx
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx
  • apps/mobile/src/components/profile-screen.tsx
  • apps/mobile/src/components/ui/kv-row.tsx
  • apps/mobile/src/i18n/locales/en.json
  • apps/mobile/src/lib/hooks/use-settings-back-guard.ts
  • apps/mobile/src/lib/kiloclaw/access-issue.test.ts
  • apps/mobile/src/lib/kiloclaw/access-issue.ts
  • apps/mobile/src/lib/hooks/use-settings-back-guard.mounted.test.tsx

Previous review (commit 5cfe2c5)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (3 files)
  • apps/mobile/src/components/ui/motion-primitives.mounted.test.tsx
  • apps/mobile/src/components/ui/refresh-progress.tsx
  • apps/mobile/src/lib/a11y/motion.tsx

Previous review (commit 9e751aa)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 1
SUGGESTION 0
Issue Details (click to expand)

WARNING

File Line Issue
apps/mobile/src/components/ui/refresh-progress.tsx 19 Always-on h-9 spacer adds a 36px gap to pull-to-refresh screens
Files Reviewed (154 files)
  • apps/mobile/package.json
  • apps/mobile/src/app/(app)/agent-chat/[session-id].mounted.test.tsx
  • apps/mobile/src/app/(app)/kiloclaw/[instance-id]/dashboard.tsx
  • apps/mobile/src/app/(app)/kiloclaw/[instance-id]/settings/exec-policy.tsx
  • apps/mobile/src/app/(app)/kiloclaw/[instance-id]/settings/model-list.tsx
  • apps/mobile/src/app/_layout.tsx
  • apps/mobile/src/components/agents/agents-tab-badge.test-helpers.ts
  • apps/mobile/src/components/agents/attachment-preview-strip.mounted.test.tsx
  • apps/mobile/src/components/agents/attachment-preview-strip.tsx
  • apps/mobile/src/components/agents/chat-composer-attachment-send.test.ts
  • apps/mobile/src/components/agents/chat-composer-input-row.mounted.test.tsx
  • apps/mobile/src/components/agents/chat-composer-input-row.tsx
  • apps/mobile/src/components/agents/chat-composer.test.ts
  • apps/mobile/src/components/agents/child-session-sheet-recovery.mounted.test.tsx
  • apps/mobile/src/components/agents/child-session-sheet-test-helpers.tsx
  • apps/mobile/src/components/agents/child-session-sheet.mounted.test.tsx
  • apps/mobile/src/components/agents/file-part-renderer.mounted.test.tsx
  • apps/mobile/src/components/agents/file-part-renderer.tsx
  • apps/mobile/src/components/agents/fixed-part-row.mounted.test.tsx
  • apps/mobile/src/components/agents/fixed-part-row.tsx
  • apps/mobile/src/components/agents/instance-picker.mounted.test.tsx
  • apps/mobile/src/components/agents/live-session-list-empty-state.tsx
  • apps/mobile/src/components/agents/markdown-table.test.ts
  • apps/mobile/src/components/agents/markdown-table.tsx
  • apps/mobile/src/components/agents/message-details-sheet.mounted.test.tsx
  • apps/mobile/src/components/agents/message-details-sheet.tsx
  • apps/mobile/src/components/agents/new-session-configure-form.test.ts
  • apps/mobile/src/components/agents/new-session-repository-section.tsx
  • apps/mobile/src/components/agents/new-session-start-button.tsx
  • apps/mobile/src/components/agents/permission-card.mounted.test.tsx
  • apps/mobile/src/components/agents/permission-card.tsx
  • apps/mobile/src/components/agents/preparation-group.tsx
  • apps/mobile/src/components/agents/question-card.mounted.test.tsx
  • apps/mobile/src/components/agents/question-card.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-queue.test.ts
  • apps/mobile/src/components/agents/session-list-content.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-content.tsx
  • apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-screen.tsx
  • apps/mobile/src/components/agents/session-list-search-header.tsx
  • apps/mobile/src/components/agents/session-status-indicator.tsx
  • apps/mobile/src/components/agents/working-indicator.tsx
  • apps/mobile/src/components/animated-splash-overlay-reveal.mounted.test.tsx
  • apps/mobile/src/components/animated-splash-overlay.mounted.test.tsx
  • apps/mobile/src/components/animated-splash-overlay.tsx
  • apps/mobile/src/components/app-unlock-screen.test-helpers.tsx
  • apps/mobile/src/components/centered-state.stability.mounted.test.tsx
  • apps/mobile/src/components/centered-state.tsx
  • apps/mobile/src/components/code-reviewer/bitbucket-connect-form.tsx
  • apps/mobile/src/components/code-reviewer/option-list.tsx
  • apps/mobile/src/components/code-reviewer/platform-overview-screen.mounted.test.tsx
  • apps/mobile/src/components/code-reviewer/platform-overview-screen.tsx
  • apps/mobile/src/components/code-reviewer/provider-connect-card.tsx
  • apps/mobile/src/components/code-reviewer/review-memory-screen.mounted.test.tsx
  • apps/mobile/src/components/code-reviewer/review-memory-screen.tsx
  • apps/mobile/src/components/context-control.mounted.test.tsx
  • apps/mobile/src/components/context-control.tsx
  • apps/mobile/src/components/destination-option-row.tsx
  • apps/mobile/src/components/detail-screen.tsx
  • apps/mobile/src/components/home/home-screen.mounted.test.tsx
  • apps/mobile/src/components/home/home-screen.test.ts
  • apps/mobile/src/components/home/home-screen.tsx
  • apps/mobile/src/components/kilo-chat/conversation-list-screen.mounted.test.tsx
  • apps/mobile/src/components/kilo-chat/conversation-list-screen.tsx
  • apps/mobile/src/components/kilo-chat/message-attachment-preview-chip.tsx
  • apps/mobile/src/components/kilo-chat/message-attachment.tsx
  • apps/mobile/src/components/kilo-pass/kilo-pass-subscription-screen.test.ts
  • apps/mobile/src/components/kilo-pass/kilo-pass-subscription-screen.tsx
  • apps/mobile/src/components/kilo-pass/restore-purchases-button.tsx
  • apps/mobile/src/components/kiloclaw/dashboard-parts.tsx
  • apps/mobile/src/components/kiloclaw/full-surface-states.mounted.test.tsx
  • apps/mobile/src/components/kiloclaw/instance-list-screen.tsx
  • apps/mobile/src/components/kiloclaw/onboarding-flow.tsx
  • apps/mobile/src/components/kiloclaw/onboarding/full-surface-states.mounted.test.tsx
  • apps/mobile/src/components/kiloclaw/onboarding/identity-step.test.tsx
  • apps/mobile/src/components/kiloclaw/onboarding/identity-step.tsx
  • apps/mobile/src/components/kiloclaw/onboarding/notifications-step.mounted.test.tsx
  • apps/mobile/src/components/kiloclaw/onboarding/notifications-step.tsx
  • apps/mobile/src/components/kiloclaw/onboarding/provisioning-step.tsx
  • apps/mobile/src/components/kiloclaw/settings-card.tsx
  • apps/mobile/src/components/language-picker-sheet.mounted.test.tsx
  • apps/mobile/src/components/language-picker-sheet.tsx
  • apps/mobile/src/components/login-screen.test.ts
  • apps/mobile/src/components/login-screen.tsx
  • apps/mobile/src/components/login/__tests__/idle-auth.mounted.test.tsx
  • apps/mobile/src/components/login/email-otp-form.tsx
  • apps/mobile/src/components/login/idle-auth.tsx
  • apps/mobile/src/components/notifications-screen.mounted.test.tsx
  • apps/mobile/src/components/notifications-screen.tsx
  • apps/mobile/src/components/organization/invoices-screen.mounted.test.tsx
  • apps/mobile/src/components/organization/invoices-screen.tsx
  • apps/mobile/src/components/organization/organization-boundary.mounted.test.tsx
  • apps/mobile/src/components/organization/organization-boundary.tsx
  • apps/mobile/src/components/pr-review/diff/pr-diff-file-list.test.tsx
  • apps/mobile/src/components/pr-review/diff/pr-diff-file-list.tsx
  • apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.test.tsx
  • apps/mobile/src/components/pr-review/diff/pr-diff-file-navigator.tsx
  • apps/mobile/src/components/pr-review/diff/pr-diff-hunk-rows.test.tsx
  • apps/mobile/src/components/pr-review/full-surface-states.mounted.test.tsx
  • apps/mobile/src/components/pr-review/merge/pr-merge-section-parts.tsx
  • apps/mobile/src/components/pr-review/pr-review-comment-composer-screen.tsx
  • apps/mobile/src/components/pr-review/pr-review-connect-gate-view.test.ts
  • apps/mobile/src/components/pr-review/pr-review-connect-gate.tsx
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx
  • apps/mobile/src/components/pr-review/pr-review-file-navigator-screen.tsx
  • apps/mobile/src/components/pr-review/pr-review-merge-screen.tsx
  • apps/mobile/src/components/pr-review/pr-review-review-submit-screen.tsx
  • apps/mobile/src/components/pr-review/pr-review-screen.test.tsx
  • apps/mobile/src/components/pr-review/pr-review-screen.tsx
  • apps/mobile/src/components/preferences-screen.mounted.test.tsx
  • apps/mobile/src/components/preferences-screen.tsx
  • apps/mobile/src/components/profile-credits-card.mounted.test.tsx
  • apps/mobile/src/components/profile-credits-card.tsx
  • apps/mobile/src/components/quick-chat/quick-chat-screen.mounted.test.tsx
  • apps/mobile/src/components/quick-chat/quick-chat-screen.tsx
  • apps/mobile/src/components/security-agent/dashboard-screen.mounted.test.tsx
  • apps/mobile/src/components/security-agent/dashboard-screen.tsx
  • apps/mobile/src/components/security-agent/dismiss-finding-screen.mounted.test.tsx
  • apps/mobile/src/components/security-agent/dismiss-finding-screen.tsx
  • apps/mobile/src/components/security-agent/finding-analysis-panel.mounted.test.tsx
  • apps/mobile/src/components/security-agent/finding-analysis-panel.tsx
  • apps/mobile/src/components/security-agent/finding-list-screen.mounted.test.tsx
  • apps/mobile/src/components/security-agent/finding-list-screen.tsx
  • apps/mobile/src/components/security-agent/finding-remediation-panel.mounted.test.tsx
  • apps/mobile/src/components/security-agent/finding-remediation-panel.tsx
  • apps/mobile/src/components/security-agent/finding-row.tsx
  • apps/mobile/src/components/security-agent/scope-entry-screen.test.ts
  • apps/mobile/src/components/security-agent/security-agent-setup.mounted.test.tsx
  • apps/mobile/src/components/security-agent/security-agent-setup.tsx
  • apps/mobile/src/components/security-agent/settings-overview-screen.mounted.test.tsx
  • apps/mobile/src/components/security-agent/settings-save-button.tsx
  • apps/mobile/src/components/share/share-gate-sheet.mounted.test.tsx
  • apps/mobile/src/components/tab-screen.tsx
  • apps/mobile/src/components/ui/action-button.tsx
  • apps/mobile/src/components/ui/activity-indicator.tsx
  • apps/mobile/src/components/ui/button.mounted.test.tsx
  • apps/mobile/src/components/ui/button.tsx
  • apps/mobile/src/components/ui/motion-primitives.mounted.test.tsx
  • apps/mobile/src/components/ui/refresh-control.tsx
  • apps/mobile/src/components/ui/refresh-progress.tsx - 1 issue
  • apps/mobile/src/components/ui/skeleton.tsx
  • apps/mobile/src/components/ui/spinning-icon.tsx
  • apps/mobile/src/components/ui/status-dot.tsx
  • apps/mobile/src/components/voice-input-control.tsx
  • apps/mobile/src/lib/a11y/motion-context.ts
  • apps/mobile/src/lib/a11y/motion.mounted.test.tsx
  • apps/mobile/src/lib/a11y/motion.ts
  • apps/mobile/src/lib/a11y/motion.tsx
  • apps/mobile/src/lib/active-sessions-live-sync-mount.tsx
  • apps/mobile/src/lib/active-sessions-live-sync.race.test.ts
  • apps/mobile/src/lib/active-sessions-live-sync.ts
  • apps/mobile/src/lib/hooks/use-agent-sessions.combined.mounted.test.tsx
  • pnpm-lock.yaml

Fix these issues in Kilo Cloud


Reviewed by grok-4.6 · Input: 409.8K · Output: 26.4K · Cached: 1.2M

Review guidance: REVIEW.md from base branch main

@iscekic
iscekic marked this pull request as draft September 5, 2026 10:58
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 5, 2026
@iscekic
iscekic requested a review from eshurakov September 5, 2026 13:32
@iscekic
iscekic marked this pull request as ready for review September 5, 2026 13:32
@iscekic iscekic removed the human-ready The PR is ready for human review. label Sep 5, 2026
@iscekic
iscekic marked this pull request as draft September 5, 2026 14:26
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 5, 2026
@iscekic
iscekic marked this pull request as ready for review September 5, 2026 21:08
@iscekic iscekic removed the human-ready The PR is ready for human review. label Sep 5, 2026
@iscekic
iscekic marked this pull request as draft September 5, 2026 22:13
@iscekic
iscekic force-pushed the kwf/surface-the-mobile-app-apps--c106 branch from 9c86be2 to 8467ebf Compare September 5, 2026 22:13
@iscekic iscekic changed the title feat(mobile): add low battery mode that reduces animation feat(mobile): low battery motion mode (android) Sep 5, 2026
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 5, 2026
@iscekic
iscekic marked this pull request as ready for review September 5, 2026 22:26
@iscekic iscekic removed the human-ready The PR is ready for human review. label Sep 5, 2026
@iscekic
iscekic marked this pull request as draft September 5, 2026 22:50
@iscekic
iscekic force-pushed the kwf/surface-the-mobile-app-apps--c106 branch from cec2ef2 to 6b4eb6c Compare September 5, 2026 23:32
iscekic added a commit that referenced this pull request Sep 5, 2026
iscekic added a commit that referenced this pull request Sep 6, 2026
@iscekic
iscekic force-pushed the kwf/surface-the-mobile-app-apps--c106 branch from d9354de to d64b7eb Compare September 6, 2026 04:14
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 6, 2026
@iscekic
iscekic marked this pull request as ready for review September 6, 2026 04:26
@iscekic iscekic removed the human-ready The PR is ready for human review. label Sep 6, 2026
@iscekic
iscekic marked this pull request as draft September 6, 2026 19:38
@iscekic
iscekic marked this pull request as ready for review September 7, 2026 01:10
@iscekic iscekic added human-ready The PR is ready for human review. and removed human-ready The PR is ready for human review. labels Sep 7, 2026
@iscekic
iscekic marked this pull request as draft September 7, 2026 01:14
@iscekic
iscekic marked this pull request as ready for review September 7, 2026 02:34
@iscekic iscekic added human-ready The PR is ready for human review. and removed human-ready The PR is ready for human review. labels Sep 7, 2026
@iscekic
iscekic marked this pull request as draft September 7, 2026 02:38
@iscekic
iscekic marked this pull request as ready for review September 7, 2026 03:00
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 7, 2026
@iscekic iscekic changed the title feat(mobile): low battery motion mode (android) feat(mobile): low battery motion mode Sep 7, 2026
@iscekic
iscekic force-pushed the kwf/surface-the-mobile-app-apps--c106 branch from d64b7eb to c371a80 Compare September 7, 2026 13:17
Keep the tab-screen RefreshProgress child on main's marginBottom clearance.
Mock motion wrappers in mounted tests that now import expo-battery.
@iscekic
iscekic enabled auto-merge (squash) September 7, 2026 13:36
@iscekic
iscekic merged commit daa1919 into main Sep 7, 2026
23 checks passed
@iscekic
iscekic deleted the kwf/surface-the-mobile-app-apps--c106 branch September 7, 2026 13:42
return (
<View
accessibilityRole={showStaticProgress ? 'progressbar' : undefined}
className={`${reducedMotion ? 'h-9' : 'h-0'} items-center justify-center`}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: h-0 RefreshProgress still consumes parent gap

The slot stays mounted on every pull-to-refresh TabScreenScrollView / DetailScreenScrollView / CenteredState / list header. h-0 removes height but Yoga still treats the node as a flex item, so contentContainerClassName values like gap-6 (KiloClaw instance list) and gap-4 (Security dashboard) add extra top spacing for all users, not only low-battery mode.

Keep the View mounted for instance identity, but use hidden / display: 'none' when motion is not reduced so the node is skipped in gap.

Suggested change
className={`${reducedMotion ? 'h-9' : 'h-0'} items-center justify-center`}
className={`${reducedMotion ? 'h-9' : 'hidden'} items-center justify-center`}

Reply with @kilocode-bot fix it to have Kilo Code address this issue.

<View {...props} className="items-center justify-center" style={style}>
<Loader2
size={indicatorDimension(size)}
color={!animating && hidesWhenStopped ? 'transparent' : color}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Reduced-motion spinner has no default color

Native ActivityIndicator supplies a platform gray when color is omitted. The static Loader2 fallback passes color through, and Lucide treats undefined as black/currentColor. Call sites such as file-part-renderer.tsx (dark:bg-neutral-900) and quick-chat-screen.tsx omit color, so the loading affordance disappears on dark surfaces in low-battery mode.

Default to a theme token (for example mutedForeground) when color is unset.


Reply with @kilocode-bot fix it to have Kilo Code address this issue.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants