1 /*
2  * Copyright (c) 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 #ifndef FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_THEME_JS_THEME_UTILS_H
17 #define FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_THEME_JS_THEME_UTILS_H
18 
19 #include "base/utils/utils.h"
20 #include "bridge/common/utils/utils.h"
21 #include "bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h"
22 #include "bridge/declarative_frontend/ark_theme/theme_apply/js_theme.h"
23 #include "bridge/js_frontend/engine/jsi/js_value.h"
24 #include "core/components_ng/base/frame_node.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 
27 namespace OHOS::Ace::Framework {
28 class JSThemeUtils {
29 private:
30     /**
31      * Obtain the Id of WithTheme container which corresponds to current node.
32      * This invokes the globalThis.themeScopeMgr.getWithThemeIdForElmtId method on JS level.
33      */
GetWithThemeId()34     static int32_t GetWithThemeId()
35     {
36         // use default theme if theme scope is desabled
37         int32_t ret = 0;
38         if (!JSThemeScope::jsThemeScopeEnabled) {
39             return ret;
40         }
41         // take theme scope id from js level method
42         auto elmId = NG::ViewStackProcessor::GetInstance()->GetNodeIdToAccountFor();
43         auto runtime = std::static_pointer_cast<ArkJSRuntime>(JsiDeclarativeEngineInstance::GetCurrentRuntime());
44         CHECK_NULL_RETURN(runtime, ret);
45         auto global = runtime->GetGlobal();
46         auto scopeMgr = global->GetProperty(runtime, "themeScopeMgr");
47         if (!scopeMgr->IsObject(runtime)) {
48             return ret;
49         }
50         auto func = scopeMgr->GetProperty(runtime, "getWithThemeIdForElmtId");
51         if (!func->IsFunction(runtime)) {
52             return ret;
53         }
54         std::vector<shared_ptr<JsValue>> argv;
55         argv.push_back(runtime->NewInt32(elmId));
56         auto retVal = func->Call(runtime, scopeMgr, argv, argv.size());
57         CHECK_NULL_RETURN(retVal, ret);
58         ret = retVal->ToInt32(runtime);
59         return ret;
60     }
61 
62 public:
63     static constexpr int32_t DEFAULT_ALPHA = 255;
64     static constexpr double DEFAULT_OPACITY = 0.2;
65 
GetTheme()66     static std::optional<JSTheme> GetTheme()
67     {
68         auto themeId = GetWithThemeId();
69         auto it = JSThemeScope::jsThemes.find(themeId);
70         return (it != JSThemeScope::jsThemes.end()) ? std::make_optional(it->second) : std::nullopt;
71     }
72 
GetThemeColors()73     static std::optional<JSThemeColors> GetThemeColors()
74     {
75         auto themeId = GetWithThemeId();
76         auto it = JSThemeScope::jsThemes.find(themeId);
77         return (it != JSThemeScope::jsThemes.end()) ? std::make_optional(it->second.Colors()) : std::nullopt;
78     }
79 };
80 }
81 #endif //FRAMEWORKS_BRIDGE_DECLARATIVE_FRONTEND_THEME_JS_THEME_UTILS_H