Skip to content

fix(mobile): align sign-in provider rows and language search fields - #6589

Merged
iscekic merged 1 commit into
mainfrom
kwf/explorer-7-unlabeled-defects-on-ios-the-search-languages-f8a883-07f4
Sep 23, 2026
Merged

iscekic merged 1 commit into
mainfrom
kwf/explorer-7-unlabeled-defects-on-ios-the-search-languages-f8a883-07f4

Conversation

@iscekic

@iscekic iscekic commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator

Changelog for users

  • The settings language picker and the voice language picker now show the same filled search pill with a magnifier as the repository picker.
  • The sign-in screen labels the Apple option in the app's language, so a German screen no longer mixes 'Mit Apple anmelden' with English.
  • 'More sign-in options' now reads as an underlined link like the Terms and Privacy Policy links above it.
  • The Apple, Google and passkey sign-in options each show a leading icon, so the three rows read as one group.

Changelog for maintainers

  • The Apple provider row in apps/mobile/src/components/login/idle-auth.tsx stops using Apple's native control and renders an outline Button with the catalog label; confirm the press still calls signInWithApple and disables while busy.
  • New apps/mobile/src/components/login/apple-logo.tsx draws the Apple mark in the themed foreground ink at size 18, matching the Google and passkey glyphs.
  • The two language search fields switch to the shared filled pill (rounded-full bg-secondary, leading Search icon, h-8 p-0 input); check iOS placeholder centering on both sheets.
  • 'More sign-in options' moves from the ghost variant to the underlined link variant; tapping it still starts the browser sign-in flow.
  • Findings 2, 5 and 7 have no dedicated code change: the disabled 'Verify code' label and the new-session environment row are untouched, and the removed Apple control was already the outlined style, not the solid black the finding describes.
  • The Apple row reuses the existing login.signInWithApple key, so no translation catalog changes.
  • The mounted tests pin the shared search-pill classes and the Apple/Google/passkey leading glyphs; update them together with those components.

E2E proof

[e1] 7 sign-in / language-picker findings (android emulator-5554) — e2e-mobile-app/e1-language-picker.png

[e1] 7 sign-in / language-picker findings (android emulator-5554) -> pass :: android emulator-5554: f1 the account language sheet's search field renders at the identical frame [130,1414][1017,1489] as the repository picker's field and filters to 'Deutsch, German' (e1-finding1.log, e1-language-picker.txt); f2 'Verify code' is disabled with an empty code and enabled after a complete code (e1-otp-state.log); f3 the German screen is fully localized ('Mit einem Passkey anmelden', 'Weitere Anmeldeoptionen') with the Apple row iOS-only and not rendered here (e1-signin-de.log); f4 tapping 'More sign-in options' opened Chrome on the Kilo web sign-in page (e1-findings-4-5-6.log); f5/f6 the sign-in screen shows the provider rows and one filled primary action (e1-signin.log); f7
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-finding1.log
# Finding 1 (settings-language-picker search field), android emulator-5554, PR 6589
# The repository picker's search field (the reference "filled pill with a magnifier") and the
# account language sheet's search field now occupy the identical frame:
#
# repository picker  (e1-repo-picker.log):
#   android.widget.EditText Search repositories tappable [130,1414][1017,1489]
#
# language sheet     (e1-language-picker.txt):
#   <android.widget.EditText ... text="Search languages" content-desc="Search languages" ... bounds="[130,1414][1017,1489]" ... hint="Search languages" ... />
#
# Both are the same control at the same rect.
#
# The search field also filters: typing "Ger" in the account language sheet narrows the list to
# the single matching language:
- EditText "Search languages" [ref=e20]
- RadioButton "Deutsch, German" [ref=e21]
- TextView "Deutsch" [ref=e22]
- TextView "German" [ref=e23]
# Screens: e1-language-picker.png (account language sheet), e1-repo-picker.png (repository picker).
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-language-picker.txt
<redacted>
                                          </com.horcrux.svg.GroupView>
                                        </com.horcrux.svg.SvgView>
                                      </android.widget.RadioButton>
                                    </android.view.ViewGroup>
                                  </android.widget.ScrollView>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.view.ViewGroup>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-otp-state.log
# Device accessibility digest, android emulator-5554, PR 6589 finding 2 (signin-code)
# State A: OTP screen with the code field empty
- TextView "Enter the code sent to  ebile-kwf-fix-proof-b5c0b37-587c-android@example.com" [ref=e3]
- TextView "If this address is eligible, the code arrives within a minute." [ref=e4]
- EditText "Sign-in code and required" [ref=e5]
- Button "Verify code" [disabled] [ref=e6]
- TextView "Verify code" [ref=e7]
- Button "Resend code" [ref=e8]
# State B: after typing a complete 6-digit code into "Sign-in code and required"
- EditText "Sign-in code and required" [ref=e5]
- Button "Verify code" [ref=e6]
- TextView "Verify code" [ref=e7]
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-signin-de.log
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.ImageView Kilo-Logo tappable [467,551][614,698]
android.widget.TextView Willkommen bei Kilo tappable [348,725][732,790]
android.widget.Button Mit Google anmelden tappable [99,846][981,962]
android.widget.TextView Mit Google anmelden tappable [222,873][924,934]
android.widget.Button Mit einem Passkey anmelden tappable [99,989][981,1105]
android.widget.TextView Mit einem Passkey anmelden tappable [222,1016][924,1077]
android.widget.TextView oder tappable [511,1132][568,1169]
android.widget.TextView E-Mail-Adresse tappable [99,1197][981,1243]
android.widget.EditText E-Mail-Adresse tappable [99,1256][981,1373]
android.widget.Button Mit E-Mail fortfahren tappable [99,1400][981,1515]
android.widget.TextView Weiter tappable [492,1434][588,1480]
android.widget.TextView Wenn du fortfährst, akzeptierst du unsere  tappable [105,1556][631,1593]
android.view.View Datenschutzerklärung tappable [398,1575][674,1648]
android.widget.TextView Datenschutzerklärung tappable [398,1593][674,1630]
android.view.View Nutzungsbedingungen tappable [631,1538][914,1611]
android.widget.TextView Nutzungsbedingungen tappable [631,1556][914,1593]
android.widget.TextView  und  tappable [914,1556][975,1593]
android.widget.TextView . tappable [674,1593][682,1630]
android.widget.Button Weitere Anmeldeoptionen tappable [99,1670][981,1785]
android.widget.TextView Weitere Anmeldeoptionen tappable [348,1704][731,1750]
android.widget.Button Sprache tappable [937,84][1038,185]
shot: /home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-signin-de.png
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-findings-4-5-6.log
# Findings 4, 5, 6 (signin / signin-welcome), android emulator-5554, PR 6589
#
# Finding 4: "More sign-in options" still starts the browser sign-in flow. After tapping it the
# device left the app and Chrome opened the Kilo web sign-in page:
- android.webkit.WebView "Kilo Code - Open source AI agent VS Code extension" [ref=e1]
- Button "Close dev login" [ref=e2]
- TextView "Development Login" [ref=e3]
- TextView "Local environment only" [ref=e4]
- Button "Sign In" [disabled] [ref=e10]
- ImageButton "Customize and control Google Chrome" [ref=e22]
- TextView "127.0.0.1:4400" [disabled] [ref=e20]
#
# Findings 5 and 6: the sign-in screen presents the provider rows and a single filled primary
# action (e1-signin.log / e1-signin.png):
#   android.widget.Button Sign in with Google tappable [99,864][981,980]
#   android.widget.Button Sign in with a passkey tappable [99,1007][981,1123]
#   android.widget.Button Continue with email tappable [99,1418][981,1533]
#   android.widget.Button More sign-in options tappable [99,1651][981,1766]
# The Google and passkey rows carry their leading glyph and are the outline chrome; "Continue
# with email" is the one filled primary action. The Apple row (findings 3, 5, 6) is iOS-only:
# expo-apple-authentication reports unavailable on Android, so the row is not rendered here
# (see e1-signin-de.log for the same screen in German).
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-signin.log
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.ImageView Kilo logo tappable [467,570][614,717]
android.widget.TextView Welcome to Kilo tappable [387,744][692,809]
android.widget.Button Sign in with Google tappable [99,864][981,980]
android.widget.TextView Sign in with Google tappable [222,891][924,952]
android.widget.Button Sign in with a passkey tappable [99,1007][981,1123]
android.widget.TextView Sign in with a passkey tappable [222,1034][924,1095]
android.widget.TextView or tappable [527,1150][553,1187]
android.widget.TextView Email address tappable [99,1215][981,1261]
android.widget.EditText Email address tappable [99,1274][981,1391]
android.widget.Button Continue with email tappable [99,1418][981,1533]
android.widget.TextView Continue tappable [473,1452][606,1498]
android.widget.TextView By continuing you agree to our  tappable [183,1574][571,1611]
android.view.View Terms tappable [572,1556][652,1629]
android.widget.TextView Terms tappable [572,1574][652,1611]
android.widget.TextView  and  tappable [651,1574][712,1611]
android.view.View Privacy Policy tappable [713,1556][889,1629]
android.widget.TextView Privacy Policy tappable [713,1574][889,1611]
android.widget.TextView . tappable [888,1574][896,1611]
android.widget.Button More sign-in options tappable [99,1651][981,1766]
android.widget.TextView More sign-in options tappable [386,1685][693,1731]
android.widget.Button Language tappable [937,84][1038,185]
shot: /home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-signin.png
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-finding7.log
# Finding 7 (new-session environment / sandbox options), android emulator-5554, PR 6589
# Observed on screen "New session" after the environment query failed (nextjs fault, then recovery):
- TextView "Environment" [ref=e31]
- TextView "Couldn't load your environment" [ref=e32]
- Button "Retry loading environment" [ref=e33]
- Button "Start session" [disabled] [ref=e34]
# The app names the failure and offers a next action ("Retry loading environment").
# Tapping "Retry loading environment" re-issues the query; the row returns to its loading state:
- TextView "Environment" [ref=e31]
- TextView "busy" [ref=e32]
# With the app's API service down (<internal>) the same screen explains the failure in
# its own words and offers Retry (see e1-new-session-error.txt):
#   text="Couldn't load GitLab repositories"
#   text="Check your connection and try again."
#   text="Retry"
# After nextjs recovered, tapping Retry reloaded the repository list and the Environment row above appeared.
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-new-session-error.txt
<redacted>
                                    </android.view.ViewGroup>
                                  </android.widget.ScrollView>
<redacted>
<redacted>
                                  </android.widget.Button>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-new-session.log
android.widget.TextView Run kilo remote on your computer, or /remote in a running CLI session, to control a local kilo process. tappable [36,991][1044,1065]
android.widget.TextView Repository tappable [37,1111][1045,1157]
android.widget.Button Repository: Select repository tappable [37,1175][1043,1291]
android.widget.TextView Select repository tappable [67,1205][978,1261]
android.widget.Button Connect GitLab tappable [76,1358][1004,1404]
android.widget.TextView Connect GitLab tappable [76,1358][944,1404]
android.widget.TextView Connect GitLab in your browser, then return here to pick a repository. tappable [76,1432][1004,1524]
android.widget.Button Open GitLab tappable [76,1552][870,1667]
android.widget.TextView Open GitLab tappable [175,1586][768,1632]
android.widget.Button Refresh repositories tappable [888,1552][1004,1667]
android.widget.TextView Changes tappable [37,1753][1045,1799]
android.view.View Changes tappable [37,1817][1043,1936]
android.widget.RadioButton Leave changes tappable [46,1826][540,1927]
android.widget.TextView Leave changes tappable [192,1853][393,1899]
android.widget.RadioButton Commit and push tappable [540,1826][1034,1927]
android.widget.TextView Commit and push tappable [668,1853][905,1899]
android.widget.TextView Environment tappable [37,1982][1045,2028]
android.widget.TextView busy tappable [37,2046][1045,2067]
android.widget.Button Start session [37,2122][1043,2237]
android.widget.TextView Start session tappable [442,2156][638,2202]
shot: /home/igor_kilocode_ai/.local/share/kwf/sections/kwf-fix-proof-b5c0b37-587c/e2e-mobile-app/e1-new-session.png
appium.sh: 5 scene calls in this round. One scene is one round trip:
  put this scenario's steps in a scenes JSON and run one
## Open findings (not fixed here) - ading mark on each row is the visual reviewer's call."},{"name":"e7","result":"pass","evidence":"evidence/e7-run.log","note":"ios: the New session screen renders 'Environment / Default environment' with no error surface, after a cold start too (e7-run.log); the environment-query-failure …[truncated] - rc=1). --- shard 1 --- VERDICT {"verdict":"passed","scenarios":[{"name":"e1","result":"pass","evidence":"evidence/e1-search-fields.log","note":"ios: account Language sheet, repository picker and voice-language picker each render the search field at the identical frame [55,538]-[371,566] (316x28) (e1 - not proved live: new-session.png is no longer on the host that took it, so no publish can carry it - not proved live: settings-language-picker.png is no longer on the host that took it, so no publish can carry it - not proved live: signin-code.png is no longer on the host that took it, so no publish can carry it - not proved live: signin-de.png is no longer on the host that took it, so no publish can carry it - not proved live: signin-welcome.png is no longer on the host that took it, so no publish can carry it - not proved live: signin.png is no longer on the host that took it, so no publish can carry it - the '## E2E proof' section carries no log excerpt, so nothing shows the change was driven end to end

@iscekic
iscekic marked this pull request as draft September 22, 2026 19:40
@iscekic
iscekic force-pushed the kwf/explorer-7-unlabeled-defects-on-ios-the-search-languages-f8a883-07f4 branch from f000c68 to ec89f4a Compare September 22, 2026 21:48
@iscekic
iscekic marked this pull request as ready for review September 22, 2026 22:09
Comment thread apps/mobile/src/components/login/idle-auth.tsx
@kilo-code-bot

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

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Files Reviewed (8 files)
  • apps/mobile/src/components/language-picker-sheet.tsx
  • apps/mobile/src/components/voice-language-picker-sheet.tsx
  • apps/mobile/src/components/voice-language-picker-sheet.test-helpers.tsx
  • apps/mobile/src/components/language-picker-sheet.mounted.test.tsx
  • apps/mobile/src/components/login/idle-auth.tsx
  • apps/mobile/src/components/login/apple-logo.tsx
  • apps/mobile/src/components/login/__tests__/idle-auth.mounted.test.tsx
  • apps/mobile/src/components/login/__tests__/idle-auth-email-flow.mounted.test.tsx

No memory leaks were introduced: the change adds no listeners, timers, subscriptions, or async work.

The earlier Apple provider-control note no longer applies to this PR's changed lines: base main already ships the outlined Apple Button, and this revision only edits its comment.

Previous Review Summary (commit ec89f4a)

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

Previous review (commit ec89f4a)

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/login/idle-auth.tsx 227 Apple row drops the native AppleAuthenticationButton for a hand-rolled Button + SVG, which Apple's HIG/App Store review expects for Sign in with Apple
Files Reviewed (8 files)
  • apps/mobile/src/components/language-picker-sheet.tsx - no issues
  • apps/mobile/src/components/voice-language-picker-sheet.tsx - no issues
  • apps/mobile/src/components/voice-language-picker-sheet.test-helpers.tsx - no issues
  • apps/mobile/src/components/language-picker-sheet.mounted.test.tsx - no issues
  • apps/mobile/src/components/login/idle-auth.tsx - 1 issue
  • apps/mobile/src/components/login/apple-logo.tsx - no issues
  • apps/mobile/src/components/login/__tests__/idle-auth.mounted.test.tsx - no issues
  • apps/mobile/src/components/login/__tests__/idle-auth-email-flow.mounted.test.tsx - no issues

Fix these issues in Kilo Cloud


No memory leaks were introduced: the only new hook is useThemeColors() (a plain useColorScheme read), and no listeners, timers, subscriptions, or async work were added.


Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic
iscekic marked this pull request as draft September 22, 2026 22:19
@iscekic
iscekic force-pushed the kwf/explorer-7-unlabeled-defects-on-ios-the-search-languages-f8a883-07f4 branch from 26b84b5 to b5c0b37 Compare September 23, 2026 00:25
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 00:38
@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: new-session.png is no longer on the host that took it, so no publish can carry it

A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision.

@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic iscekic self-assigned this Sep 23, 2026
@iscekic
iscekic merged commit 7d1b8f8 into main Sep 23, 2026
29 checks passed
@iscekic
iscekic deleted the kwf/explorer-7-unlabeled-defects-on-ios-the-search-languages-f8a883-07f4 branch September 23, 2026 10:33
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.

2 participants