1 /*
2 * Copyright (c) 2021 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/counter/counter_theme.h"
25 #include "core/components/data_panel/data_panel_theme.h"
26 #include "core/components/dialog/dialog_theme.h"
27 #include "core/components/divider/divider_theme.h"
28 #include "core/components/drag_bar/drag_bar_theme.h"
29 #include "core/components/focus_animation/focus_animation_theme.h"
30 #include "core/components/image/image_theme.h"
31 #include "core/components/indexer/indexer_theme.h"
32 #include "core/components/list/list_item_theme.h"
33 #include "core/components/list/list_theme.h"
34 #include "core/components/marquee/marquee_theme.h"
35 #include "core/components/navigation_bar/navigation_bar_theme.h"
36 #include "core/components/picker/picker_theme.h"
37 #include "core/components/piece/piece_theme.h"
38 #include "core/components/popup/popup_theme.h"
39 #include "core/components/progress/progress_theme.h"
40 #include "core/components/qrcode/qrcode_theme.h"
41 #include "core/components/rating/rating_theme.h"
42 #include "core/components/refresh/refresh_theme.h"
43 #include "core/components/scroll/scroll_bar_theme.h"
44 #include "core/components/search/search_theme.h"
45 #include "core/components/select/select_theme.h"
46 #include "core/components/semi_modal/semi_modal_theme.h"
47 #include "core/components/slider/slider_theme.h"
48 #include "core/components/stepper/stepper_theme.h"
49 #include "core/components/swiper/swiper_indicator_theme.h"
50 #include "core/components/tab_bar/tab_theme.h"
51 #include "core/components/text/text_theme.h"
52 #include "core/components/text_field/textfield_theme.h"
53 #include "core/components/text_overlay/text_overlay_theme.h"
54 #include "core/components/theme/app_theme.h"
55 #include "core/components/theme/card_theme.h"
56 #include "core/components/theme/icon_theme.h"
57 #include "core/components/toast/toast_theme.h"
58 #include "core/components/toggle/toggle_theme.h"
59 #include "core/components/tool_bar/tool_bar_theme.h"
60 #include "core/components/video/video_theme.h"
61 #include "core/components_ng/pattern/app_bar/app_bar_theme.h"
62 #include "core/components_v2/pattern_lock/pattern_lock_theme.h"
63
64 namespace OHOS::Ace {
65 namespace {
66 template<class T>
ThemeBuildFunc(const RefPtr<ThemeConstants> & themeConstants)67 RefPtr<Theme> ThemeBuildFunc(const RefPtr<ThemeConstants>& themeConstants)
68 {
69 return T().Build(themeConstants);
70 }
71
72 const std::unordered_map<ThemeType, RefPtr<Theme>(*)(const RefPtr<ThemeConstants>& themeConstants)> THEME_BUILDERS = {
73 { AppTheme::TypeId(), &ThemeBuildFunc<AppTheme::Builder> },
74 { ButtonTheme::TypeId(), &ThemeBuildFunc<ButtonTheme::Builder> },
75 { PickerTheme::TypeId(), &ThemeBuildFunc<PickerTheme::Builder> },
76 { CheckboxTheme::TypeId(), &ThemeBuildFunc<CheckboxTheme::Builder> },
77 { SwitchTheme::TypeId(), &ThemeBuildFunc<SwitchTheme::Builder> },
78 { RadioTheme::TypeId(), &ThemeBuildFunc<RadioTheme::Builder> },
79 { DialogTheme::TypeId(), &ThemeBuildFunc<DialogTheme::Builder> },
80 { MarqueeTheme::TypeId(), &ThemeBuildFunc<MarqueeTheme::Builder> },
81 { NavigationBarTheme::TypeId(), &ThemeBuildFunc<NavigationBarTheme::Builder> },
82 { SelectTheme::TypeId(), &ThemeBuildFunc<SelectTheme::Builder> },
83 { SliderTheme::TypeId(), &ThemeBuildFunc<SliderTheme::Builder> },
84 { SwiperIndicatorTheme::TypeId(), &ThemeBuildFunc<SwiperIndicatorTheme::Builder> },
85 { PopupTheme::TypeId(), &ThemeBuildFunc<PopupTheme::Builder> },
86 { ProgressTheme::TypeId(), &ThemeBuildFunc<ProgressTheme::Builder> },
87 { VideoTheme::TypeId(), &ThemeBuildFunc<VideoTheme::Builder> },
88 { TabTheme::TypeId(), &ThemeBuildFunc<TabTheme::Builder> },
89 { RefreshTheme::TypeId(), &ThemeBuildFunc<RefreshTheme::Builder> },
90 { ListTheme::TypeId(), &ThemeBuildFunc<ListTheme::Builder> },
91 { ListItemTheme::TypeId(), &ThemeBuildFunc<ListItemTheme::Builder> },
92 { ToastTheme::TypeId(), &ThemeBuildFunc<ToastTheme::Builder> },
93 { TextTheme::TypeId(), &ThemeBuildFunc<TextTheme::Builder> },
94 { RatingTheme::TypeId(), &ThemeBuildFunc<RatingTheme::Builder> },
95 { TextFieldTheme::TypeId(), &ThemeBuildFunc<TextFieldTheme::Builder> },
96 { FocusAnimationTheme::TypeId(), &ThemeBuildFunc<FocusAnimationTheme::Builder> },
97 { ScrollBarTheme::TypeId(), &ThemeBuildFunc<ScrollBarTheme::Builder> },
98 { CalendarTheme::TypeId(), &ThemeBuildFunc<CalendarTheme::Builder> },
99 { SearchTheme::TypeId(), &ThemeBuildFunc<SearchTheme::Builder> },
100 { TextOverlayTheme::TypeId(), &ThemeBuildFunc<TextOverlayTheme::Builder> },
101 { DividerTheme::TypeId(), &ThemeBuildFunc<DividerTheme::Builder> },
102 { ToggleTheme::TypeId(), &ThemeBuildFunc<ToggleTheme::Builder> },
103 { ClockTheme::TypeId(), &ThemeBuildFunc<ClockTheme::Builder> },
104 { DataPanelTheme::TypeId(), &ThemeBuildFunc<DataPanelTheme::Builder> },
105 { BadgeTheme::TypeId(), &ThemeBuildFunc<BadgeTheme::Builder> },
106 { PieceTheme::TypeId(), &ThemeBuildFunc<PieceTheme::Builder> },
107 { StepperTheme::TypeId(), &ThemeBuildFunc<StepperTheme::Builder> },
108 { ToolBarTheme::TypeId(), &ThemeBuildFunc<ToolBarTheme::Builder> },
109 { CardTheme::TypeId(), &ThemeBuildFunc<CardTheme::Builder> },
110 { QrcodeTheme::TypeId(), &ThemeBuildFunc<QrcodeTheme::Builder> },
111 { CameraTheme::TypeId(), &ThemeBuildFunc<CameraTheme::Builder> },
112 { ImageTheme::TypeId(), &ThemeBuildFunc<ImageTheme::Builder> },
113 { CounterTheme::TypeId(), &ThemeBuildFunc<CounterTheme::Builder> },
114 { DragBarTheme::TypeId(), &ThemeBuildFunc<DragBarTheme::Builder> },
115 { SemiModalTheme::TypeId(), &ThemeBuildFunc<SemiModalTheme::Builder> },
116 { IconTheme::TypeId(), &ThemeBuildFunc<IconTheme::Builder> },
117 { V2::PatternLockTheme::TypeId(), &ThemeBuildFunc<V2::PatternLockTheme::Builder> },
118 { IndexerTheme::TypeId(), &ThemeBuildFunc<IndexerTheme::Builder> },
119 { NG::AppBarTheme::TypeId(), &ThemeBuildFunc<NG::AppBarTheme::Builder> }
120 };
121 } // namespace
122
ThemeManagerImpl()123 ThemeManagerImpl::ThemeManagerImpl()
124 {
125 auto resAdapter = ResourceAdapter::Create();
126 themeConstants_ = AceType::MakeRefPtr<ThemeConstants>(resAdapter);
127 }
128
GetTheme(ThemeType type)129 RefPtr<Theme> ThemeManagerImpl::GetTheme(ThemeType type)
130 {
131 auto findIter = themes_.find(type);
132 if (findIter != themes_.end()) {
133 return findIter->second;
134 }
135 auto builderIter = THEME_BUILDERS.find(type);
136 if (builderIter == THEME_BUILDERS.end()) {
137 LOGE("No theme builder defined! type=%{public}zu", type);
138 return nullptr;
139 }
140 auto theme = builderIter->second(themeConstants_);
141 themes_.emplace(type, theme);
142 return theme;
143 }
144
GetBackgroundColor() const145 Color ThemeManagerImpl::GetBackgroundColor() const
146 {
147 auto findIter = themes_.find(AppTheme::TypeId());
148 if (findIter != themes_.end()) {
149 auto appTheme = AceType::DynamicCast<AppTheme>(findIter->second);
150 if (appTheme) {
151 return appTheme->GetBackgroundColor();
152 }
153 }
154 // Parse attr from system theme style.
155 auto themeStyle = themeConstants_->GetThemeStyle();
156 auto prebuildColor = themeConstants_->GetColor(THEME_APP_BACKGROUND);
157 if (!themeStyle) {
158 return prebuildColor;
159 }
160 if (themeStyle->HasAttr(THEME_ATTR_BG_COLOR) && !themeConstants_->HasCustomStyle(THEME_APP_BACKGROUND)) {
161 // Get from resource.
162 return themeStyle->GetAttr<Color>(THEME_ATTR_BG_COLOR, Color::BLACK);
163 } else {
164 // Get from prebuild or custom color.
165 return prebuildColor;
166 }
167 }
168
LoadResourceThemes()169 void ThemeManagerImpl::LoadResourceThemes()
170 {
171 themes_.clear();
172 themeConstants_->LoadTheme(currentThemeId_);
173 }
174 } // namespace OHOS::Ace
175