1 /*
2 * Copyright (c) 2021-2023 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "core/components/theme/theme_manager_impl.h"
17
18 #include "core/components/badge/badge_theme.h"
19 #include "core/components/button/button_theme.h"
20 #include "core/components/calendar/calendar_theme.h"
21 #include "core/components/camera/camera_theme.h"
22 #include "core/components/checkable/checkable_theme.h"
23 #include "core/components/clock/clock_theme.h"
24 #include "core/components/close_icon/close_icon_theme.h"
25 #include "core/components/counter/counter_theme.h"
26 #include "core/components/data_panel/data_panel_theme.h"
27 #include "core/components/dialog/dialog_theme.h"
28 #include "core/components/divider/divider_theme.h"
29 #include "core/components/drag_bar/drag_bar_theme.h"
30 #include "core/components/focus_animation/focus_animation_theme.h"
31 #include "core/components/hyperlink/hyperlink_theme.h"
32 #include "core/components/image/image_theme.h"
33 #include "core/components/indexer/indexer_theme.h"
34 #include "core/components/list/list_item_theme.h"
35 #include "core/components/list/list_theme.h"
36 #include "core/components/marquee/marquee_theme.h"
37 #include "core/components/navigation_bar/navigation_bar_theme.h"
38 #include "core/components/picker/picker_theme.h"
39 #include "core/components/piece/piece_theme.h"
40 #include "core/components/popup/popup_theme.h"
41 #include "core/components/progress/progress_theme.h"
42 #include "core/components/qrcode/qrcode_theme.h"
43 #include "core/components/rating/rating_theme.h"
44 #include "core/components/refresh/refresh_theme.h"
45 #include "core/components/scroll/scroll_bar_theme.h"
46 #include "core/components/search/search_theme.h"
47 #include "core/components/select/select_theme.h"
48 #include "core/components/semi_modal/semi_modal_theme.h"
49 #include "core/components/slider/slider_theme.h"
50 #include "core/components/stepper/stepper_theme.h"
51 #include "core/components/swiper/swiper_indicator_theme.h"
52 #include "core/components/tab_bar/tab_theme.h"
53 #include "core/components/text/text_theme.h"
54 #include "core/components/text_field/textfield_theme.h"
55 #include "core/components/text_overlay/text_overlay_theme.h"
56 #include "core/components/theme/app_theme.h"
57 #include "core/components/theme/card_theme.h"
58 #include "core/components/theme/icon_theme.h"
59 #include "core/components/toast/toast_theme.h"
60 #include "core/components/toggle/toggle_theme.h"
61 #include "core/components/tool_bar/tool_bar_theme.h"
62 #include "core/components/video/video_theme.h"
63 #include "core/components_ng/pattern/app_bar/app_bar_theme.h"
64 #include "core/components_ng/pattern/form/form_theme.h"
65 #include "core/components_ng/pattern/security_component/security_component_theme.h"
66 #include "core/components_ng/pattern/side_bar/side_bar_theme.h"
67 #include "core/components_v2/pattern_lock/pattern_lock_theme.h"
68 #include "core/components/theme/advanced_pattern_theme.h"
69 #include "core/components_ng/pattern/rich_editor/rich_editor_theme.h"
70
71 namespace OHOS::Ace {
72 namespace {
73 template<class T>
ThemeBuildFunc(const RefPtr<ThemeConstants> & themeConstants)74 RefPtr<Theme> ThemeBuildFunc(const RefPtr<ThemeConstants>& themeConstants)
75 {
76 return T().Build(themeConstants);
77 }
78
79 const std::unordered_map<ThemeType, RefPtr<Theme>(*)(const RefPtr<ThemeConstants>& themeConstants)> THEME_BUILDERS = {
80 { AppTheme::TypeId(), &ThemeBuildFunc<AppTheme::Builder> },
81 { ButtonTheme::TypeId(), &ThemeBuildFunc<ButtonTheme::Builder> },
82 { PickerTheme::TypeId(), &ThemeBuildFunc<PickerTheme::Builder> },
83 { CheckboxTheme::TypeId(), &ThemeBuildFunc<CheckboxTheme::Builder> },
84 { SwitchTheme::TypeId(), &ThemeBuildFunc<SwitchTheme::Builder> },
85 { RadioTheme::TypeId(), &ThemeBuildFunc<RadioTheme::Builder> },
86 { DialogTheme::TypeId(), &ThemeBuildFunc<DialogTheme::Builder> },
87 { MarqueeTheme::TypeId(), &ThemeBuildFunc<MarqueeTheme::Builder> },
88 { NavigationBarTheme::TypeId(), &ThemeBuildFunc<NavigationBarTheme::Builder> },
89 { SelectTheme::TypeId(), &ThemeBuildFunc<SelectTheme::Builder> },
90 { SliderTheme::TypeId(), &ThemeBuildFunc<SliderTheme::Builder> },
91 { SwiperIndicatorTheme::TypeId(), &ThemeBuildFunc<SwiperIndicatorTheme::Builder> },
92 { PopupTheme::TypeId(), &ThemeBuildFunc<PopupTheme::Builder> },
93 { ProgressTheme::TypeId(), &ThemeBuildFunc<ProgressTheme::Builder> },
94 { VideoTheme::TypeId(), &ThemeBuildFunc<VideoTheme::Builder> },
95 { TabTheme::TypeId(), &ThemeBuildFunc<TabTheme::Builder> },
96 { RefreshTheme::TypeId(), &ThemeBuildFunc<RefreshTheme::Builder> },
97 { ListTheme::TypeId(), &ThemeBuildFunc<ListTheme::Builder> },
98 { ListItemTheme::TypeId(), &ThemeBuildFunc<ListItemTheme::Builder> },
99 { ToastTheme::TypeId(), &ThemeBuildFunc<ToastTheme::Builder> },
100 { TextTheme::TypeId(), &ThemeBuildFunc<TextTheme::Builder> },
101 { RatingTheme::TypeId(), &ThemeBuildFunc<RatingTheme::Builder> },
102 { TextFieldTheme::TypeId(), &ThemeBuildFunc<TextFieldTheme::Builder> },
103 { FocusAnimationTheme::TypeId(), &ThemeBuildFunc<FocusAnimationTheme::Builder> },
104 { ScrollBarTheme::TypeId(), &ThemeBuildFunc<ScrollBarTheme::Builder> },
105 { CalendarTheme::TypeId(), &ThemeBuildFunc<CalendarTheme::Builder> },
106 { SearchTheme::TypeId(), &ThemeBuildFunc<SearchTheme::Builder> },
107 { TextOverlayTheme::TypeId(), &ThemeBuildFunc<TextOverlayTheme::Builder> },
108 { DividerTheme::TypeId(), &ThemeBuildFunc<DividerTheme::Builder> },
109 { ToggleTheme::TypeId(), &ThemeBuildFunc<ToggleTheme::Builder> },
110 { ClockTheme::TypeId(), &ThemeBuildFunc<ClockTheme::Builder> },
111 { DataPanelTheme::TypeId(), &ThemeBuildFunc<DataPanelTheme::Builder> },
112 { BadgeTheme::TypeId(), &ThemeBuildFunc<BadgeTheme::Builder> },
113 { PieceTheme::TypeId(), &ThemeBuildFunc<PieceTheme::Builder> },
114 { StepperTheme::TypeId(), &ThemeBuildFunc<StepperTheme::Builder> },
115 { ToolBarTheme::TypeId(), &ThemeBuildFunc<ToolBarTheme::Builder> },
116 { CardTheme::TypeId(), &ThemeBuildFunc<CardTheme::Builder> },
117 { QrcodeTheme::TypeId(), &ThemeBuildFunc<QrcodeTheme::Builder> },
118 { CameraTheme::TypeId(), &ThemeBuildFunc<CameraTheme::Builder> },
119 { HyperlinkTheme::TypeId(), &ThemeBuildFunc<HyperlinkTheme::Builder> },
120 { ImageTheme::TypeId(), &ThemeBuildFunc<ImageTheme::Builder> },
121 { CounterTheme::TypeId(), &ThemeBuildFunc<CounterTheme::Builder> },
122 { DragBarTheme::TypeId(), &ThemeBuildFunc<DragBarTheme::Builder> },
123 { SemiModalTheme::TypeId(), &ThemeBuildFunc<SemiModalTheme::Builder> },
124 { IconTheme::TypeId(), &ThemeBuildFunc<IconTheme::Builder> },
125 { V2::PatternLockTheme::TypeId(), &ThemeBuildFunc<V2::PatternLockTheme::Builder> },
126 { IndexerTheme::TypeId(), &ThemeBuildFunc<IndexerTheme::Builder> },
127 { NG::AppBarTheme::TypeId(), &ThemeBuildFunc<NG::AppBarTheme::Builder> },
128 { AdvancedPatternTheme::TypeId(), &ThemeBuildFunc<AdvancedPatternTheme::Builder> },
129 { NG::SecurityComponentTheme::TypeId(), &ThemeBuildFunc<NG::SecurityComponentTheme::Builder> },
130 { NG::FormTheme::TypeId(), &ThemeBuildFunc<NG::FormTheme::Builder> },
131 { CloseIconTheme::TypeId(), &ThemeBuildFunc<CloseIconTheme::Builder> },
132 { NG::SideBarTheme::TypeId(), &ThemeBuildFunc<NG::SideBarTheme::Builder> },
133 { NG::RichEditorTheme::TypeId(), &ThemeBuildFunc<NG::RichEditorTheme::Builder> }
134 };
135 } // namespace
136
ThemeManagerImpl()137 ThemeManagerImpl::ThemeManagerImpl()
138 {
139 auto resAdapter = ResourceAdapter::Create();
140 themeConstants_ = AceType::MakeRefPtr<ThemeConstants>(resAdapter);
141 }
142
GetTheme(ThemeType type)143 RefPtr<Theme> ThemeManagerImpl::GetTheme(ThemeType type)
144 {
145 auto findIter = themes_.find(type);
146 if (findIter != themes_.end()) {
147 return findIter->second;
148 }
149 auto builderIter = THEME_BUILDERS.find(type);
150 if (builderIter == THEME_BUILDERS.end()) {
151 LOGE("No theme builder defined! type=%{public}zu", type);
152 return nullptr;
153 }
154 auto theme = builderIter->second(themeConstants_);
155 themes_.emplace(type, theme);
156 return theme;
157 }
158
GetBackgroundColor() const159 Color ThemeManagerImpl::GetBackgroundColor() const
160 {
161 auto findIter = themes_.find(AppTheme::TypeId());
162 if (findIter != themes_.end()) {
163 auto appTheme = AceType::DynamicCast<AppTheme>(findIter->second);
164 if (appTheme) {
165 return appTheme->GetBackgroundColor();
166 }
167 }
168 // Parse attr from system theme style.
169 auto themeStyle = themeConstants_->GetThemeStyle();
170 auto prebuildColor = themeConstants_->GetColor(THEME_APP_BACKGROUND);
171 if (!themeStyle) {
172 return prebuildColor;
173 }
174 if (themeStyle->HasAttr(THEME_ATTR_BG_COLOR) && !themeConstants_->HasCustomStyle(THEME_APP_BACKGROUND)) {
175 // Get from resource.
176 return themeStyle->GetAttr<Color>(THEME_ATTR_BG_COLOR, Color::BLACK);
177 } else {
178 // Get from prebuild or custom color.
179 return prebuildColor;
180 }
181 }
182
LoadResourceThemes()183 void ThemeManagerImpl::LoadResourceThemes()
184 {
185 themes_.clear();
186 themeConstants_->LoadTheme(currentThemeId_);
187 }
188 } // namespace OHOS::Ace
189