Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
signalapp
GitHub Repository: signalapp/Signal-iOS
Path: blob/main/SignalUI/Appearance/Theme+Icons.swift
1 views
//
// Copyright 2019 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
//

import SignalServiceKit

public enum ThemeIcon: UInt {
    case settingsAccount
    case settingsLinkedDevices
    case settingsDonate
    case settingsAppearance
    case settingsChats
    case settingsStories
    case settingsNotifications
    case settingsPrivacy
    case settingsDataUsage
    case settingsPayments
    case settingsHelp
    case settingsInvite
    case settingsAdvanced

    case donateManageSubscription
    case donateBadges
    case donateGift
    case donateReceipts

    case profileName
    case profileUsername
    case profileAbout
    case profileBadges

    case chatListClearFilter
    case chatListFilterByUnread
    case chatSettingsTimerOn
    case chatSettingsTimerOff
    case chatSettingsWallpaper
    case chatSettingsMessageSound
    case chatSettingsBlock
    case chatSettingsMute
    case chatSettingsMentions
    case contactInfoSafetyNumber
    case contactInfoUserInContacts
    case contactInfoAddToContacts
    case contactInfoNameEducation
    case contactInfoSignalConnection
    case contactInfoNoDirectChat
    case contactInfoPendingRequest
    case contactInfoPhone
    case contactInfoGroups
    case contactInfoNote
    case groupInfoLeaveGroup
    case groupInfoAddMembers
    case groupInfoShowAllMembers
    case groupInfoGroupLink
    case groupInfoRequestAndInvites
    case groupInfoPermissions
    case groupInfoEditName
    case groupInfoEditDescription
    case groupMemberRemoveFromGroup
    case groupMemberMakeGroupAdmin
    case groupMemberRevokeGroupAdmin
    case groupMemberAddToGroup

    case genericGroup
    case genericStories
    case phoneNumber
    case checkCircle
    case checkCircleFill
    case xCircle
    case xBold
    case x26
    case checkmark
    case checkmarkBold
    case circle
    case arrowDown
    case arrowUp
    case arrowUp30
    case arrowRight
    case chevronUp
    case chevronDown
    case maximize16
    case minimize16
    case refresh
    case spam
    case official
    case qrCode
    case qrCodeLight
    case threadCompact
    case info
    case ellipse

    case buttonCamera
    case buttonMicrophone
    case buttonVoiceCall
    case buttonVideoCall
    case buttonNewCall
    case buttonMessage
    case buttonPhotoLibrary
    case buttonCompose
    case buttonEdit
    case buttonMute
    case buttonDelete
    case buttonSearch
    case buttonForward
    case buttonShare
    case buttonSave
    case buttonCopy
    case buttonMore
    case buttonText
    case buttonX
    case buttonRetry
    case buttonLink

    case contextMenuSave
    case contextMenuDelete
    case contextMenuReply
    case contextMenuInfo
    case contextMenuCopy
    case contextMenuShare
    case contextMenuForward
    case contextMenuSelect
    case contextMenuSpeak
    case contextMenuStopSpeaking
    case contextMenuSettings
    case contextMenuArchive
    case contextMenuEdit
    case contextMenuPrivacy
    case contextMenuXCircle
    case contextMenuOpenInChat
    case contextMenuVoiceCall
    case contextMenuVideoCall
    case contextMenuMessage

    case composeNewGroupLarge
    case composeFindByUsernameLarge
    case composeFindByPhoneNumberLarge
    case composeInviteLarge

    case errorCircle

    case compose16
    case error16
    case photo16
    case phone16
    case phoneFill16
    case video16
    case videoFill16
    case timerDisabled16
    case timer16
    case link16

    case transfer
    case register
    case backup
    case noDevice

    case emojiActivity
    case emojiAnimal
    case emojiFlag
    case emojiFood
    case emojiObject
    case emojiSmiley
    case emojiSymbol
    case emojiTravel
    case emojiRecent
    case emojiSettings

    case sealedSenderIndicator
    case empty

    case profilePlaceholder

    case raiseHand

    case pollStop
    case pollStopLight
    case poll

    case pin
    case unpin

    case memberLabel
}

// MARK: -

public extension Theme {

    class func iconImage(_ icon: ThemeIcon) -> UIImage {
        iconImage(icon, isDarkThemeEnabled: isDarkThemeEnabled)
    }

    class func iconImage(_ icon: ThemeIcon, isDarkThemeEnabled: Bool) -> UIImage {
        let name = iconName(icon, isDarkThemeEnabled: isDarkThemeEnabled)
        guard let image = UIImage(named: name) else {
            owsFailDebug("image was unexpectedly nil: \(name)")
            return UIImage()
        }

        return image
    }

    class func iconName(_ icon: ThemeIcon) -> String {
        iconName(icon, isDarkThemeEnabled: isDarkThemeEnabled)
    }

    class func iconName(_ icon: ThemeIcon, isDarkThemeEnabled: Bool) -> String {
        switch icon {
        // App Settings
        case .settingsAccount:
            return "person-circle"
        case .settingsLinkedDevices:
            return "devices"
        case .settingsDonate:
            return "heart"
        case .settingsAppearance:
            return "appearance"
        case .settingsChats:
            return "chat"
        case .settingsStories:
            return "stories"
        case .settingsNotifications:
            return "bell"
        case .settingsPrivacy:
            return "lock"
        case .settingsDataUsage:
            return "data"
        case .settingsPayments:
            return "payment"
        case .settingsHelp:
            return "help"
        case .settingsInvite:
            return "invite"
        case .settingsAdvanced:
            return "internal"
        // Donate
        case .donateManageSubscription:
            return "person"
        case .donateBadges:
            return "badge-multi"
        case .donateGift:
            return "gift"
        case .donateReceipts:
            return "receipt"
        // Profile
        case .profileName:
            return "person"
        case .profileUsername:
            return "at"
        case .profileAbout:
            return "edit"
        case .profileBadges:
            return "badge-multi"
        // Group & Contact Info
        case .chatSettingsTimerOn:
            return "timer"
        case .chatSettingsTimerOff:
            return "timer-slash"
        case .chatSettingsWallpaper:
            return "color"
        case .chatSettingsMessageSound:
            return "speaker"
        case .chatSettingsBlock:
            return "block"
        case .chatSettingsMute:
            return "bell-slash"
        case .chatSettingsMentions:
            return "at"
        case .contactInfoSafetyNumber:
            return "safety-number"
        case .contactInfoUserInContacts:
            return "person-circle"
        case .contactInfoAddToContacts:
            return "person-circle-plus"
        case .contactInfoNameEducation:
            return "person-questionmark-compact"
        case .contactInfoSignalConnection:
            return "connections"
        case .contactInfoNoDirectChat:
            return "chat-x"
        case .contactInfoPendingRequest:
            return "chat-badge"
        case .chatListFilterByUnread:
            return "chat-badge-light"
        case .chatListClearFilter:
            return "chat-x-light"
        case .contactInfoPhone:
            return "phone"
        case .contactInfoGroups:
            return "group-resizable"
        case .contactInfoNote:
            return "note-resizable"
        case .groupInfoLeaveGroup:
            return "leave"
        case .groupInfoAddMembers:
            return "plus-bold"
        case .groupInfoShowAllMembers:
            return "chevron-down-bold"
        case .groupInfoGroupLink:
            return "link"
        case .groupInfoRequestAndInvites:
            return "group"
        case .groupInfoPermissions:
            return "key"
        case .groupInfoEditName:
            return "group"
        case .groupInfoEditDescription:
            return "edit"
        case .groupMemberRemoveFromGroup:
            return "minus-circle"
        case .groupMemberMakeGroupAdmin:
            return "key"
        case .groupMemberRevokeGroupAdmin:
            return "key-slash"
        case .groupMemberAddToGroup:
            return "plus-circle"
        // Generic
        case .genericGroup:
            return "group"
        case .genericStories:
            return "stories"
        case .phoneNumber:
            return "number"
        case .checkCircle:
            return "check-circle"
        case .checkCircleFill:
            return "check-circle-fill"
        case .xCircle:
            return "x-circle"
        case .xBold:
            return "x-bold"
        case .x26:
            return "x-26"
        case .checkmark:
            return "check"
        case .checkmarkBold:
            return "check-bold"
        case .circle:
            return "circle"
        case .arrowDown:
            return "arrow-down"
        case .arrowUp:
            return "arrow-up"
        case .arrowUp30:
            return "arrow-up-30"
        case .arrowRight:
            return "arrow-right"
        case .chevronUp:
            return "chevron-up"
        case .chevronDown:
            return "chevron-down"
        case .maximize16:
            return "maximize-compact"
        case .minimize16:
            return "minimize-compact"
        case .refresh:
            return "refresh"
        case .spam:
            return "spam"
        case .official:
            return "official"
        case .qrCode:
            return "qr_code"
        case .qrCodeLight:
            return "qr_code-light"
        case .threadCompact:
            return isDarkThemeEnabled ? "thread-compact-fill" : "thread-compact"
        case .info:
            return "info"
        case .ellipse:
            return "ellipse-94"
        // Buttons (24 dp)
        case .buttonCamera:
            return "camera"
        case .buttonMicrophone:
            return "mic"
        case .buttonVoiceCall:
            return "phone"
        case .buttonVideoCall:
            return "video"
        case .buttonNewCall:
            return "phone-plus"
        case .buttonMessage:
            return "chat"
        case .buttonPhotoLibrary:
            return "album-tilt"
        case .buttonCompose:
            return "compose"
        case .buttonEdit:
            return "edit"
        case .buttonMute:
            return "bell-slash"
        case .buttonDelete:
            return "trash"
        case .buttonSearch:
            return "search"
        case .buttonForward:
            return "forward"
        case .buttonShare:
            return "share"
        case .buttonSave:
            return "save"
        case .buttonCopy:
            return "copy"
        case .buttonMore:
            return "more"
        case .buttonText:
            return "text"
        case .buttonX:
            return "x"
        case .buttonRetry:
            return "refresh"
        case .buttonLink:
            return "link"
        // Context Menus (light version of icons)
        case .contextMenuSave:
            return "save-light"
        case .contextMenuDelete:
            return "trash-light"
        case .contextMenuReply:
            return "reply-light"
        case .contextMenuInfo:
            return "info-light"
        case .contextMenuCopy:
            return "copy-light"
        case .contextMenuShare:
            return "share-light"
        case .contextMenuForward:
            return "forward-light"
        case .contextMenuSelect:
            return "check-circle-light"
        case .contextMenuSpeak:
            return "speaker-light"
        case .contextMenuStopSpeaking:
            return "pause-circle-light"
        case .contextMenuSettings:
            return "settings-light"
        case .contextMenuArchive:
            return "archive-light"
        case .contextMenuEdit:
            return "edit-light"
        case .contextMenuPrivacy:
            return "lock-light"
        case .contextMenuXCircle:
            return "x-circle-light"
        case .contextMenuOpenInChat:
            return "arrow-square-upright-light"
        case .contextMenuVoiceCall:
            return "phone-light"
        case .contextMenuVideoCall:
            return "video-light"
        case .contextMenuMessage:
            return "chat-light"
        // Empty chat list
        case .composeNewGroupLarge:
            return "group-resizable"
        case .composeFindByUsernameLarge:
            return "at-display-bold"
        case .composeFindByPhoneNumberLarge:
            return "number-resizable"
        case .composeInviteLarge:
            return "invite-resizable"
        // Error icon
        case .errorCircle:
            return "error-circle"
        // Compact 16 dp icons
        case .compose16:
            return "edit-compact"
        case .error16:
            return "error-circle-compact"
        case .photo16:
            return "photo-compact"
        case .phone16:
            return "phone-compact"
        case .phoneFill16:
            return "phone-fill-compact"
        case .video16:
            return "video-compact"
        case .videoFill16:
            return "video-fill-compact"
        case .timerDisabled16:
            return "timer-slash-compact"
        case .timer16:
            return "timer-compact"
        case .link16:
            return "link-compact"
        case .transfer:
            return "transfer-\(UIDevice.current.isIPad ? "ipad" : "phone")-outline-60-\(isDarkThemeEnabled ? "dark" : "light")"
        case .register:
            return "register-\(UIDevice.current.isIPad ? "ipad" : "phone")-outline-60-\(isDarkThemeEnabled ? "dark" : "light")"
        case .backup:
            return "backup"
        case .noDevice:
            return "device-phone-slash"
        case .emojiActivity:
            return "emoji-activity"
        case .emojiAnimal:
            return "emoji-animal"
        case .emojiFlag:
            return "emoji-flag"
        case .emojiFood:
            return "emoji-food"
        case .emojiObject:
            return "emoji-object"
        case .emojiSmiley:
            return "emoji-smiley"
        case .emojiSymbol:
            return "emoji-symbol"
        case .emojiTravel:
            return "emoji-travel"
        case .emojiRecent:
            return "recent-20"
        case .emojiSettings:
            return "settings"
        case .sealedSenderIndicator:
            return "unidentified-delivery-outline-20"
        case .empty:
            return "empty-24"
        case .profilePlaceholder:
            return isDarkThemeEnabled ? "profile-placeholder-dark-56" : "profile-placeholder-56"
        case .raiseHand:
            return "raise_hand"
        // Polls
        case .pollStop:
            return "pollstop"
        case .pollStopLight:
            return "pollStop-light"
        case .poll:
            return "poll"
        case .pin:
            return "pin"
        case .unpin:
            return "pin-slash"
        case .memberLabel:
            return "tag"
        }
    }
}