fix: move multi-select indicators into a leading gutter#1488
Conversation
|
Warning Review limit reached
Next review available in: 47 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (3)
📒 Files selected for processing (9)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Ready to review this PR? Stage has broken it down into 5 individual chapters for you:
Chapters generated by Stage for commit c6e7b52 on Jul 16, 2026 3:22pm UTC. |
Preview APK for PR #1488Home-screen label: 1488 White Noise with the blueprint launcher icon — installs side-by-side with the production and staging apps. Install directly — one tap, no GitHub sign-in (public, content-addressed Every push to this PR rebuilds and updates this comment. |
|
BLOCKING:
SUGGESTIONS:
NITPICK: FOLLOW-UP:
SUMMARY: The leading-gutter structure is directionally correct and the focused dual-flavor tests, compilation, and ktlint pass at VERDICT: REQUEST_CHANGES Verification at exact head
|
8d5fac2 to
c6e7b52
Compare
|
Addressed the blocking review at c6e7b52: rebased onto current master while preserving #1435 text-selection guards and coordinates; centered the leading indicator for tall rows; added incoming/outgoing layout coverage; and added visually inspected Light/Dark/AMOLED Roborazzi baselines. Exact local CI commands all pass. @coderabbitai review |
🧩 Analysis chain🏁 Script executed: #!/bin/bash
set -euo pipefail
echo '== PR metadata =='
gh pr view 1488 --repo marmot-protocol/whitenoise-android \
--json number,headRefOid,baseRefOid,mergeStateStatus,isDraft,changedFiles \
--jq '{number, headRefOid, baseRefOid, mergeStateStatus, isDraft, changedFiles}'
echo
echo '== Diff summary against merge-base =='
base="$(git merge-base HEAD origin/master)"
printf 'merge-base: %s\n' "$base"
git diff --stat "$base"...HEAD
git diff --name-only "$base"...HEAD
echo
echo '== Candidate source/test file locations =='
fd -a -t f 'MessageBubble(\.kt|Selection\.kt|.*CoverageTest\.kt|.*Amoled.*Test\.kt)$' . | sort
echo
echo '== Kotlin structural outlines for changed Kotlin files =='
git diff --name-only "$base"...HEAD -- '*.kt' | while IFS= read -r file; do
echo "--- $file ---"
ast-grep outline "$file" --items all --view compact || true
doneLength of output: 6155 🏁 Script executed: #!/bin/bash
set -euo pipefail
base="$(git merge-base HEAD origin/master)"
echo '== AST outlines =='
for file in \
app/src/main/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubble.kt \
app/src/main/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubbleSelection.kt \
app/src/main/java/dev/ipf/whitenoise/android/ui/common/SelectionRowIcon.kt \
app/src/test/java/dev/ipf/whitenoise/android/ui/conversation/MessageMultiSelectCoverageTest.kt \
app/src/test/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubbleSelectionIndicatorCoverageTest.kt \
app/src/test/java/dev/ipf/whitenoise/android/ui/screenshot/MessageBubbleSelectionScreenshotTest.kt; do
echo "--- $file ---"
ast-grep outline "$file" --items all --view signatures || true
done
echo
echo '== Production Kotlin diff =='
git diff --unified=80 "$base"...HEAD -- \
app/src/main/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubble.kt \
app/src/main/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubbleSelection.kt \
app/src/main/java/dev/ipf/whitenoise/android/ui/common/SelectionRowIcon.kt \
app/src/main/java/dev/ipf/whitenoise/android/ui/chats/ChatRow.kt
echo
echo '== Test Kotlin diff =='
git diff --unified=50 "$base"...HEAD -- \
app/src/test/java/dev/ipf/whitenoise/android/ui/conversation/MessageMultiSelectCoverageTest.kt \
app/src/test/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubbleAmoledStyleTest.kt \
app/src/test/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubbleSelectionIndicatorCoverageTest.kt \
app/src/test/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubbleTextTest.kt \
app/src/test/java/dev/ipf/whitenoise/android/ui/screenshot/MessageBubbleSelectionScreenshotTest.kt
echo
echo '== Guard and coordinate contexts in MessageBubble.kt =='
rg -n -C 8 \
'textSelectionMode|longPressWindowPosition|positionInWindow|onLongClick|combinedClickable|detect.*Gesture|onGloballyPositioned|onClickLabel' \
app/src/main/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubble.ktLength of output: 126392 🏁 Script executed: #!/bin/bash
set -euo pipefail
file='app/src/main/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubble.kt'
echo '== Long-press/action-menu state assignments and close paths =='
rg -n -C 5 \
'(longPressWindowPosition|longPressWindowY|onActionMenuOpenChange)\s*(=|\()' \
"$file"
echo
echo '== `#1435` base interaction code for comparison =='
git show 3f3feb32beea466649f3581f11fd47df2ceecc1c:"$file" | \
sed -n '560,710p;925,970p;1475,1510p;1595,1635p'
echo
echo '== Complete focused test sources =='
sed -n '1,380p' \
app/src/test/java/dev/ipf/whitenoise/android/ui/conversation/messages/MessageBubbleSelectionIndicatorCoverageTest.kt
sed -n '1,180p' \
app/src/test/java/dev/ipf/whitenoise/android/ui/screenshot/MessageBubbleSelectionScreenshotTest.kt
echo
echo '== GitHub mergeability and checks =='
gh pr view 1488 --repo marmot-protocol/whitenoise-android \
--json mergeStateStatus,reviewDecision,statusCheckRollup \
--jq '{mergeStateStatus, reviewDecision, checks: [.statusCheckRollup[] | {name, status, conclusion}]}'Length of output: 42634
Confirmed at
The PR is still a draft and GitHub’s compile/test/lint and APK checks are currently in progress, so If you found this review helpful, would you consider giving us a shout-out on X? Thank you for using CodeRabbit! ✅ Action performedReview finished.
|
Fixes #1485
Summary
Verification
./gradlew :app:compileDevZapstoreDebugKotlin :app:compileDevPlayDebugKotlin --no-daemon --stacktrace./gradlew :app:testDevZapstoreDebugUnitTest :app:testDevPlayDebugUnitTest --no-daemon --stacktrace./gradlew :app:verifyRoborazziDevZapstoreDebug :app:verifyRoborazziDevPlayDebug --no-daemon --stacktrace./gradlew :app:ktlintCheck --no-daemon --stacktrace./gradlew :app:lintDevZapstoreDebug :app:lintDevPlayDebug --no-daemon --stacktraceAll passed locally at
c6e7b522. Light, Dark, and AMOLED selection-state Roborazzi baselines were also inspected visually.Sensitive paths
None.