1 /*
2  * Copyright (c) 2021-2024 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/common/agingadapation/aging_adapation_dialog_theme.h"
19 #include "core/components/badge/badge_theme.h"
20 #include "core/components/button/button_theme.h"
21 #include "core/components/calendar/calendar_theme.h"
22 #include "core/components/camera/camera_theme.h"
23 #include "core/components/checkable/checkable_theme.h"
24 #include "core/components/clock/clock_theme.h"
25 #include "core/components/close_icon/close_icon_theme.h"
26 #include "core/components/counter/counter_theme.h"
27 #include "core/components/data_panel/data_panel_theme.h"
28 #include "core/components/dialog/dialog_theme.h"
29 #include "core/components/divider/divider_theme.h"
30 #include "core/components/drag_bar/drag_bar_theme.h"
31 #include "core/components/focus_animation/focus_animation_theme.h"
32 #include "core/components/hyperlink/hyperlink_theme.h"
33 #include "core/components/image/image_theme.h"
34 #include "core/components/indexer/indexer_theme.h"
35 #include "core/components/list/list_item_theme.h"
36 #include "core/components/list/list_theme.h"
37 #include "core/components/marquee/marquee_theme.h"
38 #include "core/components/navigation_bar/navigation_bar_theme.h"
39 #include "core/components/picker/picker_theme.h"
40 #include "core/components/piece/piece_theme.h"
41 #include "core/components/popup/popup_theme.h"
42 #include "core/components/progress/progress_theme.h"
43 #include "core/components/qrcode/qrcode_theme.h"
44 #include "core/components/rating/rating_theme.h"
45 #include "core/components/refresh/refresh_theme.h"
46 #include "core/components/scroll/scroll_bar_theme.h"
47 #include "core/components/search/search_theme.h"
48 #include "core/components/select/select_theme.h"
49 #include "core/components/semi_modal/semi_modal_theme.h"
50 #include "core/components/slider/slider_theme.h"
51 #include "core/components/stepper/stepper_theme.h"
52 #include "core/components/tab_bar/tab_theme.h"
53 #include "core/components/text_field/textfield_theme.h"
54 #include "core/components/text_overlay/text_overlay_theme.h"
55 #include "core/components/theme/advanced_pattern_theme.h"
56 #include "core/components/theme/app_theme.h"
57 #include "core/components/theme/blur_style_theme.h"
58 #include "core/components/theme/card_theme.h"
59 #include "core/components/theme/shadow_theme.h"
60 #include "core/components/toast/toast_theme.h"
61 #include "core/components/toggle/toggle_theme.h"
62 #include "core/components/tool_bar/tool_bar_theme.h"
63 #include "core/components/video/video_theme.h"
64 #include "core/components_ng/pattern/app_bar/app_bar_theme.h"
65 #include "core/components_ng/pattern/container_modal/container_modal_theme.h"
66 #include "core/components_ng/pattern/form/form_theme.h"
67 #include "core/components_ng/pattern/gauge/gauge_theme.h"
68 #include "core/components_ng/pattern/security_component/security_component_theme.h"
69 #include "core/components_ng/pattern/side_bar/side_bar_theme.h"
70 #include "core/components_v2/pattern_lock/pattern_lock_theme.h"
71 #include "core/components_ng/pattern/grid/grid_item_theme.h"
72 #include "core/components_ng/pattern/menu/menu_theme.h"
73 #include "core/components_ng/pattern/rich_editor/rich_editor_theme.h"
74 
75 namespace OHOS::Ace {
76 namespace {
77 template<class T>
ThemeBuildFunc(const RefPtr<ThemeConstants> & themeConstants)78 RefPtr<Theme> ThemeBuildFunc(const RefPtr<ThemeConstants>& themeConstants)
79 {
80     return T().Build(themeConstants);
81 }
82 
83 const std::unordered_map<ThemeType, RefPtr<Theme>(*)(const RefPtr<ThemeConstants>& themeConstants)> THEME_BUILDERS = {
84     { AppTheme::TypeId(), &ThemeBuildFunc<AppTheme::Builder> },
85     { ButtonTheme::TypeId(), &ThemeBuildFunc<ButtonTheme::Builder> },
86     { PickerTheme::TypeId(), &ThemeBuildFunc<PickerTheme::Builder> },
87     { CheckboxTheme::TypeId(), &ThemeBuildFunc<CheckboxTheme::Builder> },
88     { SwitchTheme::TypeId(), &ThemeBuildFunc<SwitchTheme::Builder> },
89     { RadioTheme::TypeId(), &ThemeBuildFunc<RadioTheme::Builder> },
90     { DialogTheme::TypeId(), &ThemeBuildFunc<DialogTheme::Builder> },
91     { MarqueeTheme::TypeId(), &ThemeBuildFunc<MarqueeTheme::Builder> },
92     { NavigationBarTheme::TypeId(), &ThemeBuildFunc<NavigationBarTheme::Builder> },
93     { SelectTheme::TypeId(), &ThemeBuildFunc<SelectTheme::Builder> },
94     { SliderTheme::TypeId(), &ThemeBuildFunc<SliderTheme::Builder> },
95     { SwiperIndicatorTheme::TypeId(), &ThemeBuildFunc<SwiperIndicatorTheme::Builder> },
96     { PopupTheme::TypeId(), &ThemeBuildFunc<PopupTheme::Builder> },
97     { ProgressTheme::TypeId(), &ThemeBuildFunc<ProgressTheme::Builder> },
98     { VideoTheme::TypeId(), &ThemeBuildFunc<VideoTheme::Builder> },
99     { TabTheme::TypeId(), &ThemeBuildFunc<TabTheme::Builder> },
100     { RefreshTheme::TypeId(), &ThemeBuildFunc<RefreshTheme::Builder> },
101     { ListTheme::TypeId(), &ThemeBuildFunc<ListTheme::Builder> },
102     { ListItemTheme::TypeId(), &ThemeBuildFunc<ListItemTheme::Builder> },
103     { ToastTheme::TypeId(), &ThemeBuildFunc<ToastTheme::Builder> },
104     { TextTheme::TypeId(), &ThemeBuildFunc<TextTheme::Builder> },
105     { RatingTheme::TypeId(), &ThemeBuildFunc<RatingTheme::Builder> },
106     { TextFieldTheme::TypeId(), &ThemeBuildFunc<TextFieldTheme::Builder> },
107     { FocusAnimationTheme::TypeId(), &ThemeBuildFunc<FocusAnimationTheme::Builder> },
108     { ScrollBarTheme::TypeId(), &ThemeBuildFunc<ScrollBarTheme::Builder> },
109     { CalendarTheme::TypeId(), &ThemeBuildFunc<CalendarTheme::Builder> },
110     { SearchTheme::TypeId(), &ThemeBuildFunc<SearchTheme::Builder> },
111     { TextOverlayTheme::TypeId(), &ThemeBuildFunc<TextOverlayTheme::Builder> },
112     { DividerTheme::TypeId(), &ThemeBuildFunc<DividerTheme::Builder> },
113     { ToggleTheme::TypeId(), &ThemeBuildFunc<ToggleTheme::Builder> },
114     { ClockTheme::TypeId(), &ThemeBuildFunc<ClockTheme::Builder> },
115     { DataPanelTheme::TypeId(), &ThemeBuildFunc<DataPanelTheme::Builder> },
116     { BadgeTheme::TypeId(), &ThemeBuildFunc<BadgeTheme::Builder> },
117     { PieceTheme::TypeId(), &ThemeBuildFunc<PieceTheme::Builder> },
118     { StepperTheme::TypeId(), &ThemeBuildFunc<StepperTheme::Builder> },
119     { ToolBarTheme::TypeId(), &ThemeBuildFunc<ToolBarTheme::Builder> },
120     { CardTheme::TypeId(), &ThemeBuildFunc<CardTheme::Builder> },
121     { QrcodeTheme::TypeId(), &ThemeBuildFunc<QrcodeTheme::Builder> },
122     { CameraTheme::TypeId(), &ThemeBuildFunc<CameraTheme::Builder> },
123     { HyperlinkTheme::TypeId(), &ThemeBuildFunc<HyperlinkTheme::Builder> },
124     { ImageTheme::TypeId(), &ThemeBuildFunc<ImageTheme::Builder> },
125     { CounterTheme::TypeId(), &ThemeBuildFunc<CounterTheme::Builder> },
126     { DragBarTheme::TypeId(), &ThemeBuildFunc<DragBarTheme::Builder> },
127     { SemiModalTheme::TypeId(), &ThemeBuildFunc<SemiModalTheme::Builder> },
128     { IconTheme::TypeId(), &ThemeBuildFunc<IconTheme::Builder> },
129     { V2::PatternLockTheme::TypeId(), &ThemeBuildFunc<V2::PatternLockTheme::Builder> },
130     { IndexerTheme::TypeId(), &ThemeBuildFunc<IndexerTheme::Builder> },
131     { NG::AppBarTheme::TypeId(), &ThemeBuildFunc<NG::AppBarTheme::Builder> },
132     { AdvancedPatternTheme::TypeId(), &ThemeBuildFunc<AdvancedPatternTheme::Builder> },
133     { NG::SecurityComponentTheme::TypeId(), &ThemeBuildFunc<NG::SecurityComponentTheme::Builder> },
134     { NG::FormTheme::TypeId(), &ThemeBuildFunc<NG::FormTheme::Builder> },
135     { CloseIconTheme::TypeId(), &ThemeBuildFunc<CloseIconTheme::Builder> },
136     { NG::SideBarTheme::TypeId(), &ThemeBuildFunc<NG::SideBarTheme::Builder> },
137     { NG::RichEditorTheme::TypeId(), &ThemeBuildFunc<NG::RichEditorTheme::Builder> },
138     { NG::GridItemTheme::TypeId(), &ThemeBuildFunc<NG::GridItemTheme::Builder> },
139     { NG::MenuTheme::TypeId(), &ThemeBuildFunc<NG::MenuTheme::Builder> },
140     { NG::GaugeTheme::TypeId(), &ThemeBuildFunc<NG::GaugeTheme::Builder> },
141     { NG::SheetTheme::TypeId(), &ThemeBuildFunc<NG::SheetTheme::Builder> },
142     { BlurStyleTheme::TypeId(), &ThemeBuildFunc<BlurStyleTheme::Builder> },
143     { AgingAdapationDialogTheme::TypeId(), &ThemeBuildFunc<AgingAdapationDialogTheme::Builder> },
144     { ShadowTheme::TypeId(), &ThemeBuildFunc<ShadowTheme::Builder> },
145     { NG::ContainerModalTheme::TypeId(), &ThemeBuildFunc<NG::ContainerModalTheme::Builder> },
146 };
147 } // namespace
148 
ThemeManagerImpl()149 ThemeManagerImpl::ThemeManagerImpl()
150 {
151     auto resAdapter = ResourceAdapter::Create();
152     themeConstants_ = AceType::MakeRefPtr<ThemeConstants>(resAdapter);
153 }
154 
ThemeManagerImpl(RefPtr<ResourceAdapter> & resourceAdapter)155 ThemeManagerImpl::ThemeManagerImpl(RefPtr<ResourceAdapter>& resourceAdapter)
156 {
157     themeConstants_ = AceType::MakeRefPtr<ThemeConstants>(resourceAdapter);
158 }
159 
GetTheme(ThemeType type)160 RefPtr<Theme> ThemeManagerImpl::GetTheme(ThemeType type)
161 {
162     auto findIter = themes_.find(type);
163     if (findIter != themes_.end()) {
164         return findIter->second;
165     }
166     auto builderIter = THEME_BUILDERS.find(type);
167     if (builderIter == THEME_BUILDERS.end()) {
168         return nullptr;
169     }
170     auto theme = builderIter->second(themeConstants_);
171     themes_.emplace(type, theme);
172     return theme;
173 }
174 
GetBackgroundColor() const175 Color ThemeManagerImpl::GetBackgroundColor() const
176 {
177     auto findIter = themes_.find(AppTheme::TypeId());
178     if (findIter != themes_.end()) {
179         auto appTheme = AceType::DynamicCast<AppTheme>(findIter->second);
180         if (appTheme) {
181             return appTheme->GetBackgroundColor();
182         }
183     }
184     // Parse attr from system theme style.
185     auto themeStyle = themeConstants_->GetThemeStyle();
186     auto prebuildColor = themeConstants_->GetColor(THEME_APP_BACKGROUND);
187     if (!themeStyle) {
188         return prebuildColor;
189     }
190     if (themeStyle->HasAttr(THEME_ATTR_BG_COLOR) && !themeConstants_->HasCustomStyle(THEME_APP_BACKGROUND)) {
191         // Get from resource.
192         return themeStyle->GetAttr<Color>(THEME_ATTR_BG_COLOR, Color::BLACK);
193     } else {
194         // Get from prebuild or custom color.
195         return prebuildColor;
196     }
197 }
198 
LoadResourceThemes()199 void ThemeManagerImpl::LoadResourceThemes()
200 {
201     themes_.clear();
202     themeConstants_->LoadTheme(currentThemeId_);
203 }
204 } // namespace OHOS::Ace
205