iOS/Sources/Shared/EntityIconColorProvider.swift
Bruno Pantaleão Gonçalves f57b54976f
Improve custom widget state handling and URL management (#4262)
Refactored custom widget to use AppConstants.createCustomWidgetURL for
deeplink construction. Enhanced domain state handling by introducing
isActive property and ensuring state comparison is case-insensitive.
Updated icon color logic to support additional domains (cover, fan) and
improved clarity in state checks.

<!-- 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="1342" height="952" alt="CleanShot 2026-01-28 at 10 44 39@2x"
src="https://github.com/user-attachments/assets/0d92a047-2356-45b5-8208-423d0b669e4b"
/>


## 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. -->

---------

Co-authored-by: Copilot <198982749+Copilot@users.noreply.github.com>
2026-01-28 10:52:03 +00: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 .secondary
}
}
// 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
}
}
}