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