Files
iOS/Sources/Shared/EntityIconColorProvider.swift
Bruno Pantaleão Gonçalves 3613bb8721 CarPlay iOS 26 UI Improvements (#4465)
<!-- Thank you for submitting a Pull Request and helping to improve Home
Assistant. Please complete the following sections to help the processing
and review of your changes. Please do not delete anything from this
template. -->

## Summary
<!-- Provide a brief summary of the changes you have made and most
importantly what they aim to achieve -->

## Screenshots
<!-- If this is a user-facing change not in the frontend, please include
screenshots in light and dark mode. -->
<img width="800" height="480" alt="Simulator Screenshot - Daily tester 2
- 2026-03-31 at 16 45 28"
src="https://github.com/user-attachments/assets/927764c8-9de7-49e9-98c4-8cc8fd0bcf6b"
/>

## Link to pull request in Documentation repository
<!-- Pull requests that add, change or remove functionality must have a
corresponding pull request in the Companion App Documentation repository
(https://github.com/home-assistant/companion.home-assistant). Please add
the number of this pull request after the "#" -->
Documentation: home-assistant/companion.home-assistant#

## Any other notes
<!-- If there is any other information of note, like if this Pull
Request is part of a bigger change, please include it here. -->
2026-04-01 09:39:44 +02:00

82 lines
2.4 KiB
Swift

import Foundation
import SwiftUI
public enum EntityIconColorProvider {
public static func iconColor(
domain: Domain,
state: String,
colorMode: String?,
rgbColor: [Int]?,
hsColor: [Double]?
) -> Color {
guard Domain.activeStates.map(\.rawValue).contains(state) else {
if Domain.problemStates.map(\.rawValue).contains(state) {
return .red
} else {
return .gray
}
}
// Check color_mode first if available to prioritize the correct attribute
if let colorMode {
switch colorMode {
case "rgb", "rgbw", "rgbww":
if let rgb = rgbColor, rgb.count == 3 {
return Color(
red: Double(rgb[0]) / 255.0,
green: Double(rgb[1]) / 255.0,
blue: Double(rgb[2]) / 255.0
)
}
case "hs":
if let hs = hsColor, hs.count == 2 {
return Color(hue: hs[0] / 360.0, saturation: hs[1] / 100.0, brightness: 1.0)
}
case "xy", "color_temp":
// Home Assistant usually provides rgb_color approximation for xy and color_temp
if let rgb = rgbColor, rgb.count == 3 {
return Color(
red: Double(rgb[0]) / 255.0,
green: Double(rgb[1]) / 255.0,
blue: Double(rgb[2]) / 255.0
)
}
default:
break
}
}
// Fallback or if color_mode is missing
if let rgb = rgbColor, rgb.count == 3 {
return Color(
red: Double(rgb[0]) / 255.0,
green: Double(rgb[1]) / 255.0,
blue: Double(rgb[2]) / 255.0
)
}
if let hs = hsColor, hs.count == 2 {
return Color(hue: hs[0] / 360.0, saturation: hs[1] / 100.0, brightness: 1.0)
}
return domain.accentColor
}
}
public extension Domain {
var accentColor: Color {
switch self {
case .light:
Color.Domain.light
case .switch:
Color.Domain.switch
case .fan:
Color.Domain.fan
case .cover:
Color.Domain.cover
default:
Color.haPrimary
}
}
}