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 28, 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.

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: Correct discussion view controller test (76e17eb)
Build Number: 831
Built At: Nov 24 15:17 CET (11/24 07:17 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 80.94% 81.06% -0.12%
Core/Core/Common/CommonUI/NavigationBar/UIKit/ColoredNavViewProtocol.swift 28.57% 100% -71.43%
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/Features/Session/SessionInteractor.swift 32% 33.33% -1.33%
Horizon/Horizon/Sources/Common/Utilities/Double+.swift 0% 0% 0%

Generated by 🚫 dangerJS against 76e17eb

@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-11-24

Issues Found

  • Double Availability Guards: Methods marked @available(iOS, deprecated: 26) also contain #unavailable(iOS 26) guards, creating redundant logic in ColoredNavViewProtocol and UINavigationBarExtensions

  • Missing iOS 26 Split View Handler: CoreSplitViewController delegate methods only handle iOS less than 26; no implementation exists for iOS 26+ display mode button setup, leaving potential UI gaps

  • Router Missing iOS 26 Path: Router.swift correctly guards splitDisplayModeButtonItem for iOS less than 26 but provides no iOS 26+ alternative, risking inconsistent split view behavior

  • Incomplete Navigation Bar Migration: Custom TitleSubtitleView deprecated but iOS 26+ replacement pattern (navigationSubtitle) lacks clear integration documentation or examples for callers

  • Logic Redundancy Risk: Inner guards in deprecated methods are unreachable and create maintenance confusion about when/how these methods execute

Issues found - Recommend addressing missing iOS 26+ implementations in split view controller and router before merge.

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