1 /* 2 * Copyright (c) 2021-2022 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 OHOS_JS_WINDOW_UTILS_H 17 #define OHOS_JS_WINDOW_UTILS_H 18 #include <map> 19 #include "js_runtime_utils.h" 20 #include "native_engine/native_engine.h" 21 #include "native_engine/native_value.h" 22 #include "window.h" 23 24 #ifndef WINDOW_PREVIEW 25 #include "window_manager.h" 26 #else 27 #include "mock/window_manager.h" 28 #endif 29 30 #include "window_option.h" 31 #include "wm_common.h" 32 namespace OHOS { 33 namespace Rosen { 34 constexpr int32_t RGB_LENGTH = 6; 35 constexpr int32_t RGBA_LENGTH = 8; 36 enum class ApiWindowType : uint32_t { 37 TYPE_BASE, 38 TYPE_APP = TYPE_BASE, 39 TYPE_SYSTEM_ALERT, 40 TYPE_INPUT_METHOD, 41 TYPE_STATUS_BAR, 42 TYPE_PANEL, 43 TYPE_KEYGUARD, 44 TYPE_VOLUME_OVERLAY, 45 TYPE_NAVIGATION_BAR, 46 TYPE_FLOAT, 47 TYPE_WALLPAPER, 48 TYPE_DESKTOP, 49 TYPE_LAUNCHER_RECENT, 50 TYPE_LAUNCHER_DOCK, 51 TYPE_VOICE_INTERACTION, 52 TYPE_POINTER, 53 TYPE_FLOAT_CAMERA, 54 TYPE_DIALOG, 55 TYPE_SCREENSHOT, 56 TYPE_END 57 }; 58 59 enum class LifeCycleEventType : uint32_t { 60 FOREGROUND = 1, 61 ACTIVE, 62 INACTIVE, 63 BACKGROUND, 64 }; 65 66 const std::map<WindowType, ApiWindowType> NATIVE_JS_TO_WINDOW_TYPE_MAP { 67 { WindowType::WINDOW_TYPE_APP_SUB_WINDOW, ApiWindowType::TYPE_APP }, 68 { WindowType::WINDOW_TYPE_DIALOG, ApiWindowType::TYPE_DIALOG }, 69 { WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW, ApiWindowType::TYPE_SYSTEM_ALERT }, 70 { WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT, ApiWindowType::TYPE_INPUT_METHOD }, 71 { WindowType::WINDOW_TYPE_STATUS_BAR, ApiWindowType::TYPE_STATUS_BAR }, 72 { WindowType::WINDOW_TYPE_PANEL, ApiWindowType::TYPE_PANEL }, 73 { WindowType::WINDOW_TYPE_KEYGUARD, ApiWindowType::TYPE_KEYGUARD }, 74 { WindowType::WINDOW_TYPE_VOLUME_OVERLAY, ApiWindowType::TYPE_VOLUME_OVERLAY }, 75 { WindowType::WINDOW_TYPE_NAVIGATION_BAR, ApiWindowType::TYPE_NAVIGATION_BAR }, 76 { WindowType::WINDOW_TYPE_FLOAT, ApiWindowType::TYPE_FLOAT }, 77 { WindowType::WINDOW_TYPE_FLOAT_CAMERA, ApiWindowType::TYPE_FLOAT_CAMERA }, 78 { WindowType::WINDOW_TYPE_WALLPAPER, ApiWindowType::TYPE_WALLPAPER }, 79 { WindowType::WINDOW_TYPE_DESKTOP, ApiWindowType::TYPE_DESKTOP }, 80 { WindowType::WINDOW_TYPE_LAUNCHER_RECENT, ApiWindowType::TYPE_LAUNCHER_RECENT }, 81 { WindowType::WINDOW_TYPE_LAUNCHER_DOCK, ApiWindowType::TYPE_LAUNCHER_DOCK }, 82 { WindowType::WINDOW_TYPE_VOICE_INTERACTION, ApiWindowType::TYPE_VOICE_INTERACTION }, 83 { WindowType::WINDOW_TYPE_POINTER, ApiWindowType::TYPE_POINTER }, 84 { WindowType::WINDOW_TYPE_SCREENSHOT, ApiWindowType::TYPE_SCREENSHOT }, 85 }; 86 87 const std::map<ApiWindowType, WindowType> JS_TO_NATIVE_WINDOW_TYPE_MAP { 88 { ApiWindowType::TYPE_APP, WindowType::WINDOW_TYPE_APP_SUB_WINDOW }, 89 { ApiWindowType::TYPE_DIALOG, WindowType::WINDOW_TYPE_DIALOG }, 90 { ApiWindowType::TYPE_SYSTEM_ALERT, WindowType::WINDOW_TYPE_SYSTEM_ALARM_WINDOW }, 91 { ApiWindowType::TYPE_INPUT_METHOD, WindowType::WINDOW_TYPE_INPUT_METHOD_FLOAT }, 92 { ApiWindowType::TYPE_STATUS_BAR, WindowType::WINDOW_TYPE_STATUS_BAR }, 93 { ApiWindowType::TYPE_PANEL, WindowType::WINDOW_TYPE_PANEL }, 94 { ApiWindowType::TYPE_KEYGUARD, WindowType::WINDOW_TYPE_KEYGUARD }, 95 { ApiWindowType::TYPE_VOLUME_OVERLAY, WindowType::WINDOW_TYPE_VOLUME_OVERLAY }, 96 { ApiWindowType::TYPE_NAVIGATION_BAR, WindowType::WINDOW_TYPE_NAVIGATION_BAR }, 97 { ApiWindowType::TYPE_FLOAT, WindowType::WINDOW_TYPE_FLOAT }, 98 { ApiWindowType::TYPE_FLOAT_CAMERA, WindowType::WINDOW_TYPE_FLOAT_CAMERA }, 99 { ApiWindowType::TYPE_WALLPAPER, WindowType::WINDOW_TYPE_WALLPAPER }, 100 { ApiWindowType::TYPE_DESKTOP, WindowType::WINDOW_TYPE_DESKTOP }, 101 { ApiWindowType::TYPE_LAUNCHER_RECENT, WindowType::WINDOW_TYPE_LAUNCHER_RECENT }, 102 { ApiWindowType::TYPE_LAUNCHER_DOCK, WindowType::WINDOW_TYPE_LAUNCHER_DOCK }, 103 { ApiWindowType::TYPE_VOICE_INTERACTION, WindowType::WINDOW_TYPE_VOICE_INTERACTION }, 104 { ApiWindowType::TYPE_POINTER, WindowType::WINDOW_TYPE_POINTER }, 105 { ApiWindowType::TYPE_SCREENSHOT, WindowType::WINDOW_TYPE_SCREENSHOT }, 106 }; 107 108 enum class ApiWindowMode : uint32_t { 109 UNDEFINED = 1, 110 FULLSCREEN, 111 PRIMARY, 112 SECONDARY, 113 FLOATING, 114 MODE_END = FLOATING 115 }; 116 117 const std::map<WindowMode, ApiWindowMode> NATIVE_TO_JS_WINDOW_MODE_MAP { 118 { WindowMode::WINDOW_MODE_UNDEFINED, ApiWindowMode::UNDEFINED }, 119 { WindowMode::WINDOW_MODE_FULLSCREEN, ApiWindowMode::FULLSCREEN }, 120 { WindowMode::WINDOW_MODE_SPLIT_PRIMARY, ApiWindowMode::PRIMARY }, 121 { WindowMode::WINDOW_MODE_SPLIT_SECONDARY, ApiWindowMode::SECONDARY }, 122 { WindowMode::WINDOW_MODE_FLOATING, ApiWindowMode::FLOATING }, 123 }; 124 125 const std::map<ApiWindowMode, WindowMode> JS_TO_NATIVE_WINDOW_MODE_MAP { 126 {ApiWindowMode::UNDEFINED, WindowMode::WINDOW_MODE_UNDEFINED }, 127 {ApiWindowMode::FULLSCREEN, WindowMode::WINDOW_MODE_FULLSCREEN }, 128 {ApiWindowMode::PRIMARY, WindowMode::WINDOW_MODE_SPLIT_PRIMARY }, 129 {ApiWindowMode::SECONDARY, WindowMode::WINDOW_MODE_SPLIT_SECONDARY }, 130 {ApiWindowMode::FLOATING, WindowMode::WINDOW_MODE_FLOATING }, 131 }; 132 133 enum class ApiOrientation : uint32_t { 134 UNSPECIFIED = 0, 135 PORTRAIT = 1, 136 LANDSCAPE = 2, 137 PORTRAIT_INVERTED = 3, 138 LANDSCAPE_INVERTED = 4, 139 AUTO_ROTATION = 5, 140 AUTO_ROTATION_PORTRAIT = 6, 141 AUTO_ROTATION_LANDSCAPE = 7, 142 AUTO_ROTATION_RESTRICTED = 8, 143 AUTO_ROTATION_PORTRAIT_RESTRICTED = 9, 144 AUTO_ROTATION_LANDSCAPE_RESTRICTED = 10, 145 LOCKED = 11, 146 }; 147 148 const std::map<ApiOrientation, Orientation> JS_TO_NATIVE_ORIENTATION_MAP { 149 {ApiOrientation::UNSPECIFIED, Orientation::UNSPECIFIED }, 150 {ApiOrientation::PORTRAIT, Orientation::VERTICAL }, 151 {ApiOrientation::LANDSCAPE, Orientation::HORIZONTAL }, 152 {ApiOrientation::PORTRAIT_INVERTED, Orientation::REVERSE_VERTICAL }, 153 {ApiOrientation::LANDSCAPE_INVERTED, Orientation::REVERSE_HORIZONTAL }, 154 {ApiOrientation::AUTO_ROTATION, Orientation::SENSOR }, 155 {ApiOrientation::AUTO_ROTATION_PORTRAIT, Orientation::SENSOR_VERTICAL }, 156 {ApiOrientation::AUTO_ROTATION_LANDSCAPE, Orientation::SENSOR_HORIZONTAL }, 157 {ApiOrientation::AUTO_ROTATION_RESTRICTED, Orientation::AUTO_ROTATION_RESTRICTED }, 158 {ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED }, 159 {ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED }, 160 {ApiOrientation::LOCKED, Orientation::LOCKED }, 161 }; 162 163 struct SystemBarPropertyFlag { 164 bool enableFlag; 165 bool backgroundColorFlag; 166 bool contentColorFlag; SystemBarPropertyFlagSystemBarPropertyFlag167 SystemBarPropertyFlag() : enableFlag(false), backgroundColorFlag(false), contentColorFlag(false) {} 168 }; 169 170 NativeValue* GetRectAndConvertToJsValue(NativeEngine& engine, const Rect& rect); 171 NativeValue* CreateJsWindowPropertiesObject(NativeEngine& engine, sptr<Window>& window); 172 bool SetSystemBarPropertiesFromJs(NativeEngine& engine, NativeObject* jsObject, 173 std::map<WindowType, SystemBarProperty>& properties, std::map<WindowType, SystemBarPropertyFlag>& propertyFlags, 174 sptr<Window>& window); 175 bool GetSystemBarStatus(std::map<WindowType, SystemBarProperty>& systemBarProperties, 176 std::map<WindowType, SystemBarPropertyFlag>& systemBarpropertyFlags, 177 NativeEngine& engine, NativeCallbackInfo& info, sptr<Window>& window); 178 NativeValue* CreateJsSystemBarRegionTintArrayObject(NativeEngine& engine, 179 const SystemBarRegionTints& tints); 180 NativeValue* ConvertAvoidAreaToJsValue(NativeEngine& engine, const AvoidArea& avoidArea, AvoidAreaType type); 181 bool CheckCallingPermission(std::string permission); 182 NativeValue* WindowTypeInit(NativeEngine* engine); 183 NativeValue* AvoidAreaTypeInit(NativeEngine* engine); 184 NativeValue* WindowModeInit(NativeEngine* engine); 185 NativeValue* ColorSpaceInit(NativeEngine* engine); 186 NativeValue* OrientationInit(NativeEngine* engine); 187 NativeValue* WindowStageEventTypeInit(NativeEngine* engine); 188 NativeValue* WindowEventTypeInit(NativeEngine* engine); 189 NativeValue* WindowLayoutModeInit(NativeEngine* engine); 190 NativeValue* BlurStyleInit(NativeEngine* engine); 191 NativeValue* WindowErrorCodeInit(NativeEngine* engine); 192 NativeValue* WindowErrorInit(NativeEngine* engine); 193 bool GetAPI7Ability(NativeEngine& engine, AppExecFwk::Ability* &ability); 194 template<class T> ParseJsValue(NativeObject * jsObject,NativeEngine & engine,const std::string & name,T & data)195 bool ParseJsValue(NativeObject* jsObject, NativeEngine& engine, const std::string& name, T& data) 196 { 197 NativeValue* value = jsObject->GetProperty(name.c_str()); 198 if (value->TypeOf() != NATIVE_UNDEFINED) { 199 if (!AbilityRuntime::ConvertFromJsValue(engine, value, data)) { 200 return false; 201 } 202 } else { 203 return false; 204 } 205 return true; 206 } 207 template<class T> ConvertNativeValueToVector(NativeEngine & engine,NativeValue * nativeValue,std::vector<T> & out)208 inline bool ConvertNativeValueToVector(NativeEngine& engine, NativeValue* nativeValue, std::vector<T>& out) 209 { 210 NativeArray* nativeArray = AbilityRuntime::ConvertNativeValueTo<NativeArray>(nativeValue); 211 if (nativeArray == nullptr) { 212 return false; 213 } 214 T value; 215 for (uint32_t i = 0; i < nativeArray->GetLength(); i++) { 216 if (!AbilityRuntime::ConvertFromJsValue(engine, nativeArray->GetElement(i), value)) { 217 return false; 218 } 219 out.emplace_back(value); 220 } 221 return true; 222 } 223 } 224 } 225 #endif