Skip to content

Conversation

@petkybenedek
Copy link
Contributor

@petkybenedek petkybenedek commented Nov 21, 2025

What's new

This PR adds support for the new Liquid Glass look and feel.

Approach

  • Custom toolbar colors are removed. They interfere with the Liquid Glass effect on toolbar elements.
  • Migrating to the new, system-provided navigation subtitle.
  • Removing custom split-view full-screen button, since there is a system provided one.

Implementation

  • Previously we used a custom implementation for navigation subtitles, but iOS 26 introduced a native way. Until we drop support for iOS 18, both the custom and the native implementation is used. This is the reason of the many iOS version conditions, which comes with the cost of code duplication, but only until we can delete the old custom implementations.
  • If more serious changes were needed for the new design, instead of many conditionals, I introduced "legacy" versions of properties, structs etc. In this case, the legacy version is exactly the same as before, with a deprecation warning and a message that indicates the existence of the non-legacy version. There's also a warning for the non-legacy versions. It's important to check and test both versions when making changes to either of them until we drop support for iOS 18, and remove the legacy versions.

Test plan

  • Verify that no screen has a custom toolbar color.
  • Verify all toolbar button icons are visible.

Screenshots

BeforeAfter

refs: MBL-19382
builds: All
affects: All
release note: Added support for Liquid Glass

Checklist

  • Follow-up e2e test ticket created
  • A11y checked
  • Tested on phone
  • Tested on tablet
  • Tested in dark mode
  • Tested in light mode
  • Approve from product

refs: MBL-19382
builds: All
affects: Student, Parent, Teacher
release note: Redesigned toolbars for iOS 26.
refs:
builds:
affects:
release note:

test plan:
# Conflicts:
#	Core/Core/Features/Assignments/AssignmentList/View/AssignmentListScreen.swift
#	Core/Core/Features/Dashboard/Container/View/DashboardContainerView.swift
#	Core/Core/Features/Grades/View/GradeListScreen.swift
#	Core/Core/Features/Planner/CalendarToDo/View/CalendarToDoDetailsScreen.swift
refs:
builds:
affects:
release note:

test plan:
Remove custom toolbar color and glassifying it, setting header color for grade list
@inst-danger
Copy link
Contributor

inst-danger commented Nov 21, 2025

Builds

Commit: Fix build error from conflict (e1684a3)
Build Number: 943
Built At: Dec 04 13:32 CET (12/04 05:32 AM MST)

Student
Teacher
Parent

@petkybenedek petkybenedek changed the title [All] [MBL-19340] iOS 26 redesign [All] [MBL-19382] iOS 26 redesign Nov 21, 2025
@inst-danger
Copy link
Contributor

inst-danger commented Nov 21, 2025

Warnings
⚠️ One or more files are below the minimum test coverage 50%
⚠️ The total test coverage is below the minimum 90%

Release Note:

Redesigned toolbars for iOS 26.

Affected Apps: Student, Parent, Teacher

Builds: All

MBL-19382

Coverage New % Master % Delta
Canvas iOS 82.33% 81.06% 1.27%
Core/Core/Common/CommonUI/NavigationBar/UIKit/ColoredNavViewProtocol.swift 28.57% 100% -71.43%
Core/Core/Common/Extensions/UIKit/UIScreenExtensions.swift 0% -- --
Horizon/Horizon/Sources/Features/Dashboard/SkillsHighlightsWidget/Data/ProficiencyLevel.swift 0% 0% 0%
Horizon/Horizon/Sources/Features/Notebook/Common/View/HighlightWebView/HighlightWebFeature.swift 0% 0% 0%
Horizon/Horizon/Sources/Features/Notebook/Common/View/HighlightWebView/EnableZoom.swift 0% 0% 0%
Horizon/Horizon/Sources/Common/Domain/GetCoursesInteractor.swift 38.16% 38.16% 0%
Horizon/Horizon/Sources/Features/LearningObjects/Assignment/SubmissionComment/Data/CommentAttachment.swift 0% 0% 0%
Horizon/Horizon/Sources/Features/Account/Notifications/Domain/NotificationSettingsInteractor.swift 0% 0% 0%
Horizon/Horizon/Sources/Common/Data/HModuleStatus.swift 0% 0% 0%
Horizon/Horizon/Sources/Common/Utilities/Double+.swift 0% 0% 0%

Generated by 🚫 dangerJS against e1684a3

@claude
Copy link

claude bot commented Nov 21, 2025

Claude Code Review

Updated: 2025-11-21

Scope: iOS 26 redesign affecting navigation bars, toolbars, and message UI. 36 files modified with conditional iOS version handling.

Assessment:

  • ✅ iOS availability checks properly implemented
  • ✅ No nil unwrapping crashes detected
  • ✅ Test coverage appropriately updated for iOS 26 logic
  • ✅ Deprecation warnings properly annotated
  • ✅ No breaking API changes

✅ APPROVED

@claude
Copy link

claude bot commented Nov 21, 2025

Claude Code Review - Updated 2025-11-21

Critical Issues Found:

  • Invalid iOS version: Using iOS 26 in availability checks that does not exist yet
  • Router.swift syntax error at line 260: Cannot mix availability check with comma-separated condition syntax
  • Logic contradiction: Deprecated methods with guard unavailable checks that prevent execution on target OS
  • Excessive code duplication: Large duplicate code blocks for iOS 26 branching instead of extracted methods
  • EmptyViewController constraint: Logo size multiplier doubled (0.1 to 0.2) - verify intentional

These must be fixed before merge.

Status: Issues found

@claude
Copy link

claude bot commented Nov 21, 2025

Claude Code Review

Updated: 2025-11-21

Critical Issues Found:

  • Router.swift:260 - Syntax Error: Cannot combine let binding with #unavailable(iOS 26) in comma-separated condition list. Availability checks require separate guard statement or if block.

  • iOS 26 doesn't exist yet: Using non-existent iOS version in availability checks will cause compilation failure. This appears to be a future-compatibility branch that needs the correct iOS version.

  • Large-scale refactoring without proper abstraction: Changes span 80+ files with extensive duplicated code instead of extracted helper methods.

❌ Issues found

@claude
Copy link

claude bot commented Nov 24, 2025

Claude Code Review

Critical Issues Found

  1. Logic Error in UINavigationBarExtensions.swift (lines 38, 51)

    • Functions marked @available(iOS, deprecated: 26) contain #unavailable(iOS 26) guards
    • Code paths NEVER execute on iOS 17-25 where functions are available
    • Navigation bar styling will break on pre-iOS 26 devices
  2. Logic Error in TitleSubtitleView.swift (line 85)

    • tintColorDidChange() checks #available(iOS 26, *) and returns early
    • Class is deprecated on iOS 26+, so method never executes when instantiated
    • Title color updates will fail
  3. Reversed Conditional in TitleSubtitleView.create() (lines 57-59)

    • Sets tintColor only when iOS 26+ (where class is unavailable)
    • Not set on iOS < 26 where instances exist
    • Missing color setup on pre-iOS 26
  4. Fragile Deprecation Guard in Router/CoreSplitViewController

    • Accessing splitDisplayModeButtonItem with #unavailable(iOS 26) guard
    • Creates maintenance risk if deprecation logic changes

❌ Issues found

@petkybenedek petkybenedek self-assigned this Nov 24, 2025
@claude
Copy link

claude bot commented Nov 24, 2025

Claude Code Review

Updated: 2025-12-04

Critical Issues Found:

  • UINavigationBarExtensions.swift:38, 51 - Logic Error: Methods marked @available(iOS, deprecated: 26) contain guard #unavailable(iOS 26) statements. These guards prevent code execution on iOS 17-25 where methods ARE available, breaking navigation styling on pre-iOS 26 devices.

  • TitleSubtitleView.swift:85 - Unreachable Code: tintColorDidChange() checks #available(iOS 26, *) but the class is marked @available(iOS, deprecated: 26). Method never executes when instantiated (only exists pre-iOS 26).

  • Router.swift:260 - Syntax Error: Cannot combine property access (from.splitDisplayModeButtonItem) with availability guard (#unavailable(iOS 26)) in comma-separated condition list. Requires separate guard statement.

  • Missing iOS 26+ Split View Handling: Router, CoreSplitViewController have no iOS 26+ implementation paths for splitDisplayModeButtonItem—UI gaps for split view functionality on iOS 26+.

  • Widespread Code Duplication: 80+ files with extensive conditional branching instead of extracted helper methods—increases maintenance burden and bug surface area.

Issues found

@claude
Copy link

claude bot commented Dec 4, 2025

Claude Code Review

Updated: 2025-12-04

Critical Issue Found

Logic Inversion in TitleSubtitleView.tintColorDidChange()

  • File: Core/Core/Common/CommonUI/NavigationBar/UIKit/TitleSubtitleView.swift:85
  • Bug: Uses guard #available(iOS 26, *) else { return } but class is marked @available(iOS, deprecated: 26)
  • Impact: Breaks color theming for iOS <26 users. The guard inverts the logic—it skips color updates on legacy systems where this deprecated class should work
  • Fix: Change to guard #unavailable(iOS 26) else { return } to match ColoredNavViewProtocol pattern

❌ Issues found

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants