1 /* 2 * Copyright (c) 2021-2023 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 FOUNDATION_ACE_INTERFACE_INNERKITS_ACE_UI_CONTENT_H 17 #define FOUNDATION_ACE_INTERFACE_INNERKITS_ACE_UI_CONTENT_H 18 19 #include <functional> 20 #include <map> 21 #include <memory> 22 #include <refbase.h> 23 #include <string> 24 #include <vector> 25 #include <list> 26 27 #include "arkui_rect.h" 28 #include "macros.h" 29 #include "modal_ui_extension_config.h" 30 #include "popup_ui_extension_config.h" 31 #include "serialized_gesture.h" 32 #include "serializeable_object.h" 33 #include "viewport_config.h" 34 #include "constants.h" 35 namespace OHOS { 36 37 namespace AbilityRuntime { 38 class Context; 39 } // namespace AbilityRuntime 40 41 namespace AppExecFwk { 42 class Configuration; 43 class Ability; 44 class FormAshmem; 45 } // namespace AppExecFwk 46 47 namespace Accessibility { 48 class AccessibilityElementInfo; 49 } 50 namespace Rosen { 51 class Window; 52 struct Rect; 53 enum class WindowSizeChangeReason : uint32_t; 54 enum class WindowMode : uint32_t; 55 enum class MaximizeMode : uint32_t; 56 class RSSurfaceNode; 57 class RSTransaction; 58 class Transform; 59 enum class AvoidAreaType : uint32_t; 60 class AvoidArea; 61 } // namespace Rosen 62 63 namespace AAFwk { 64 class Want; 65 } // namespace AAFwk 66 67 namespace MMI { 68 class PointerEvent; 69 class KeyEvent; 70 class AxisEvent; 71 } // namespace MMI 72 73 namespace Media { 74 class PixelMap; 75 } // namespace Media 76 77 namespace AbilityBase { 78 struct ViewData; 79 enum class AutoFillType; 80 } // namespace AbilityBase 81 82 class RefBase; 83 class Parcelable; 84 class IRemoteObject; 85 86 } // namespace OHOS 87 88 namespace OHOS::Ace { 89 struct AccessibilityParentRectInfo; 90 } // namespace OHOS::Ace 91 92 class NativeEngine; 93 typedef struct napi_value__* napi_value; 94 95 namespace OHOS::Ace { 96 class ACE_FORCE_EXPORT UIContent { 97 public: 98 static std::unique_ptr<UIContent> Create( 99 OHOS::AbilityRuntime::Context* context, NativeEngine* runtime, bool isFormRender); 100 static std::unique_ptr<UIContent> Create(OHOS::AbilityRuntime::Context* context, NativeEngine* runtime); 101 static std::unique_ptr<UIContent> Create(OHOS::AppExecFwk::Ability* ability); 102 static void ShowDumpHelp(std::vector<std::string>& info); 103 static UIContent* GetUIContent(int32_t instanceId); 104 static std::string GetCurrentUIStackInfo(); 105 106 virtual ~UIContent() = default; 107 108 // UI content life-cycles 109 virtual UIContentErrorCode Initialize(OHOS::Rosen::Window* window, const std::string& url, napi_value storage) = 0; 110 virtual UIContentErrorCode Initialize( 111 OHOS::Rosen::Window* window, const std::shared_ptr<std::vector<uint8_t>>& content, napi_value storage) = 0; 112 virtual UIContentErrorCode InitializeByName(OHOS::Rosen::Window *window, const std::string &name, 113 napi_value storage) = 0; InitializeDynamic(int32_t hostInstanceId, const std::string& hapPath, const std::string& abcPath, const std::string& entryPoint, const std::vector<std::string>& registerComponents)114 virtual void InitializeDynamic(int32_t hostInstanceId, const std::string& hapPath, const std::string& abcPath, 115 const std::string& entryPoint, const std::vector<std::string>& registerComponents) {}; 116 117 // UIExtensionAbility initialize for focusWindow ID 118 virtual void Initialize( 119 OHOS::Rosen::Window* window, const std::string& url, napi_value storage, uint32_t focusWindowID) = 0; 120 virtual void Foreground() = 0; 121 virtual void Background() = 0; 122 virtual void Focus() = 0; 123 virtual void UnFocus() = 0; 124 virtual void Destroy() = 0; 125 virtual void OnNewWant(const OHOS::AAFwk::Want& want) = 0; 126 127 // restore 128 virtual UIContentErrorCode Restore( 129 OHOS::Rosen::Window* window, const std::string& contentInfo, napi_value storage, 130 ContentInfoType type = ContentInfoType::CONTINUATION) = 0; 131 virtual std::string GetContentInfo(ContentInfoType type = ContentInfoType::CONTINUATION) const = 0; 132 virtual void DestroyUIDirector() = 0; 133 134 // UI content event process 135 virtual bool ProcessBackPressed() = 0; 136 virtual bool ProcessPointerEvent(const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent) = 0; 137 virtual bool ProcessKeyEvent(const std::shared_ptr<OHOS::MMI::KeyEvent>& keyEvent, bool isPreIme = false) = 0; 138 virtual bool ProcessAxisEvent(const std::shared_ptr<OHOS::MMI::AxisEvent>& axisEvent) = 0; 139 virtual bool ProcessVsyncEvent(uint64_t timeStampNanos) = 0; 140 virtual void SetIsFocusActive(bool isFocusActive) = 0; 141 virtual void UpdateConfiguration(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config) = 0; UpdateViewportConfig(const ViewportConfig& config, OHOS::Rosen::WindowSizeChangeReason reason, const std::shared_ptr<OHOS::Rosen::RSTransaction>& rsTransaction = nullptr, const std::map<OHOS::Rosen::AvoidAreaType, OHOS::Rosen::AvoidArea>& avoidAreas = {})142 virtual void UpdateViewportConfig(const ViewportConfig& config, OHOS::Rosen::WindowSizeChangeReason reason, 143 const std::shared_ptr<OHOS::Rosen::RSTransaction>& rsTransaction = nullptr, 144 const std::map<OHOS::Rosen::AvoidAreaType, OHOS::Rosen::AvoidArea>& avoidAreas = {}) {}; 145 virtual void UpdateWindowMode(OHOS::Rosen::WindowMode mode, bool hasDeco = true) = 0; 146 virtual void HideWindowTitleButton(bool hideSplit, bool hideMaximize, bool hideMinimize, bool hideClose) = 0; 147 virtual void SetIgnoreViewSafeArea(bool ignoreViewSafeArea) = 0; UpdateMaximizeMode(OHOS::Rosen::MaximizeMode mode)148 virtual void UpdateMaximizeMode(OHOS::Rosen::MaximizeMode mode) {}; ProcessFormVisibleChange(bool isVisible)149 virtual void ProcessFormVisibleChange(bool isVisible) {}; NotifyRotationAnimationEnd()150 virtual void NotifyRotationAnimationEnd() {}; 151 152 // only vaild in ContainerModalPatternEnhance 153 virtual void UpdateTitleInTargetPos(bool isShow, int32_t height) = 0; 154 155 // Window color 156 virtual uint32_t GetBackgroundColor() = 0; 157 virtual void SetBackgroundColor(uint32_t color) = 0; SetUIContentType(UIContentType uIContentType)158 virtual void SetUIContentType(UIContentType uIContentType) {}; 159 virtual void SetWindowContainerColor(uint32_t activeColor, uint32_t inactiveColor) = 0; 160 161 // Judge whether window need soft keyboard or not NeedSoftKeyboard()162 virtual bool NeedSoftKeyboard() 163 { 164 return false; 165 } 166 ChangeSensitiveNodes(bool isSensitive)167 virtual void ChangeSensitiveNodes(bool isSensitive) {} 168 SetOnWindowFocused(const std::function<void()>& callback)169 virtual void SetOnWindowFocused(const std::function<void()>& callback) {}; 170 171 virtual void DumpInfo(const std::vector<std::string>& params, std::vector<std::string>& info) = 0; 172 173 // Set UIContent callback for custom window animation 174 virtual void SetNextFrameLayoutCallback(std::function<void()>&& callback) = 0; 175 176 // Receive memory level notification 177 virtual void NotifyMemoryLevel(int32_t level) = 0; 178 179 virtual void SetAppWindowTitle(const std::string& title) = 0; 180 virtual void SetAppWindowIcon(const std::shared_ptr<Media::PixelMap>& pixelMap) = 0; 181 182 // ArkTS Form 183 virtual void PreInitializeForm(OHOS::Rosen::Window* window, const std::string& url, napi_value storage) = 0; 184 virtual void RunFormPage() = 0; 185 virtual std::shared_ptr<Rosen::RSSurfaceNode> GetFormRootNode() = 0; 186 187 virtual void UpdateFormData(const std::string& data) = 0; UpdateFormSharedImage(const std::map<std::string, sptr<OHOS::AppExecFwk::FormAshmem>>& imageDataMap)188 virtual void UpdateFormSharedImage(const std::map<std::string, sptr<OHOS::AppExecFwk::FormAshmem>>& imageDataMap) {} 189 190 virtual void SetFormWidth(const float width) = 0; 191 virtual void SetFormHeight(const float height) = 0; 192 virtual float GetFormWidth() = 0; 193 virtual float GetFormHeight() = 0; ReloadForm(const std::string& url)194 virtual void ReloadForm(const std::string& url) {}; OnFormSurfaceChange(float width, float height, OHOS::Rosen::WindowSizeChangeReason type = static_cast<OHOS::Rosen::WindowSizeChangeReason>(0), const std::shared_ptr<Rosen::RSTransaction>& rsTransaction = nullptr)195 virtual void OnFormSurfaceChange(float width, float height, 196 OHOS::Rosen::WindowSizeChangeReason type = static_cast<OHOS::Rosen::WindowSizeChangeReason>(0), 197 const std::shared_ptr<Rosen::RSTransaction>& rsTransaction = nullptr) {} 198 SetFormBackgroundColor(const std::string& color)199 virtual void SetFormBackgroundColor(const std::string& color) {}; SetFontScaleFollowSystem(const bool fontScaleFollowSystem)200 virtual void SetFontScaleFollowSystem(const bool fontScaleFollowSystem) {}; SetFormRenderingMode(int8_t renderMode)201 virtual void SetFormRenderingMode(int8_t renderMode) {}; 202 SetActionEventHandler(std::function<void(const std::string&)>&& actionCallback)203 virtual void SetActionEventHandler(std::function<void(const std::string&)>&& actionCallback) {}; SetErrorEventHandler(std::function<void(const std::string&, const std::string&)>&& errorCallback)204 virtual void SetErrorEventHandler(std::function<void(const std::string&, const std::string&)>&& errorCallback) {}; SetFormLinkInfoUpdateHandler(std::function<void(const std::vector<std::string>&)>&& callback)205 virtual void SetFormLinkInfoUpdateHandler(std::function<void(const std::vector<std::string>&)>&& callback) {}; RegisterAccessibilityChildTree( uint32_t parentWindowId, int32_t parentTreeId, int64_t parentElementId)206 virtual void RegisterAccessibilityChildTree( 207 uint32_t parentWindowId, int32_t parentTreeId, int64_t parentElementId) {}; SetAccessibilityGetParentRectHandler(std::function<void(int32_t&, int32_t&)>&& callback)208 virtual void SetAccessibilityGetParentRectHandler(std::function<void(int32_t&, int32_t&)>&& callback) {}; SetAccessibilityGetParentRectHandler(std::function<void(AccessibilityParentRectInfo&)>&& callback)209 virtual void SetAccessibilityGetParentRectHandler(std::function<void(AccessibilityParentRectInfo&)>&& callback) {}; DeregisterAccessibilityChildTree()210 virtual void DeregisterAccessibilityChildTree() {}; AccessibilityDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info)211 virtual void AccessibilityDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info) {}; 212 213 // for distribute UI source DumpUITree()214 virtual SerializeableObjectArray DumpUITree() 215 { 216 return SerializeableObjectArray(); 217 }; SubscribeUpdate(const std::function<void(int32_t, SerializeableObjectArray&)>& onUpdate)218 virtual void SubscribeUpdate(const std::function<void(int32_t, SerializeableObjectArray&)>& onUpdate) {} UnSubscribeUpdate()219 virtual void UnSubscribeUpdate() {} ProcessSerializeableInputEvent(const SerializeableObjectArray& array)220 virtual void ProcessSerializeableInputEvent(const SerializeableObjectArray& array) {} 221 // for distribute UI sink RestoreUITree(const SerializeableObjectArray& array)222 virtual void RestoreUITree(const SerializeableObjectArray& array) {} UpdateUITree(const SerializeableObjectArray& array)223 virtual void UpdateUITree(const SerializeableObjectArray& array) {} SubscribeInputEventProcess(const std::function<void(SerializeableObjectArray&)>& onEvent)224 virtual void SubscribeInputEventProcess(const std::function<void(SerializeableObjectArray&)>& onEvent) {} UnSubscribeInputEventProcess()225 virtual void UnSubscribeInputEventProcess() {} 226 GetResourcePaths(std::vector<std::string>& resourcesPaths, std::string& assetRootPath, std::vector<std::string>& assetBasePaths, std::string& resFolderName)227 virtual void GetResourcePaths(std::vector<std::string>& resourcesPaths, std::string& assetRootPath, 228 std::vector<std::string>& assetBasePaths, std::string& resFolderName) {}; SetResourcePaths(const std::vector<std::string>& resourcesPaths, const std::string& assetRootPath, const std::vector<std::string>& assetBasePaths)229 virtual void SetResourcePaths(const std::vector<std::string>& resourcesPaths, const std::string& assetRootPath, 230 const std::vector<std::string>& assetBasePaths) {}; 231 UpdateResource()232 virtual void UpdateResource() {} 233 GetUINapiContext()234 virtual napi_value GetUINapiContext() 235 { 236 napi_value result = nullptr; 237 return result; 238 } 239 240 /** 241 * @description: Create a full-window modal UIExtensionComponent. 242 * @param want Indicates the want of UIExtensionAbility. 243 * @param callbacks Indicates the UIExtensionComponent callbacks. 244 * @param config Indicates the Modal page configs. 245 * @return The return value is the ID of the session held by the UIExtensionComponent 246 * if creation is not successful, it returns 0 by default. 247 */ 248 virtual int32_t CreateModalUIExtension( 249 const AAFwk::Want& want, const ModalUIExtensionCallbacks& callbacks, const ModalUIExtensionConfig& config) = 0; 250 251 /** 252 * @description: Close the full-window modal. 253 * @param sessionId Indicates the sessionId of UIExtensionAbility. 254 * If the sessionId is 0, refuse to close 255 */ 256 virtual void CloseModalUIExtension(int32_t sessionId) = 0; 257 258 /** 259 * @description: Set parent ability token. 260 * @param token ability token. 261 */ 262 virtual void SetParentToken(sptr<IRemoteObject> token); 263 264 /** 265 * @description: Get parent ability token. 266 * @return return parent ability token. 267 */ 268 virtual sptr<IRemoteObject> GetParentToken(); 269 DumpViewData(AbilityBase::ViewData& viewData, AbilityBase::AutoFillType& type)270 virtual bool DumpViewData(AbilityBase::ViewData& viewData, AbilityBase::AutoFillType& type) 271 { 272 return false; 273 } 274 CheckNeedAutoSave()275 virtual bool CheckNeedAutoSave() 276 { 277 return false; 278 } 279 GetInstanceId()280 virtual int32_t GetInstanceId() 281 { 282 return -1; 283 } 284 285 /** 286 * @description: Recycle form. 287 * @return return Json string of status data of ArkTS form. 288 */ RecycleForm()289 virtual std::string RecycleForm() 290 { 291 return ""; 292 } 293 294 /** 295 * @description: Recover form. 296 * @param statusData Indicates json string of status data of ArkTS form. 297 */ RecoverForm(const std::string &statusData)298 virtual void RecoverForm(const std::string &statusData) {} 299 SetContainerModalTitleVisible(bool customTitleSettedShow, bool floatingTitleSettedShow)300 virtual void SetContainerModalTitleVisible(bool customTitleSettedShow, bool floatingTitleSettedShow) {} 301 SetContainerModalTitleHeight(int height)302 virtual void SetContainerModalTitleHeight(int height) {} 303 GetContainerModalTitleHeight()304 virtual int32_t GetContainerModalTitleHeight() 305 { 306 return -1; 307 } 308 GetContainerModalButtonsRect(Rosen::Rect& containerModal, Rosen::Rect& buttons)309 virtual bool GetContainerModalButtonsRect(Rosen::Rect& containerModal, Rosen::Rect& buttons) 310 { 311 return false; 312 } 313 SubscribeContainerModalButtonsRectChange( std::function<void(Rosen::Rect& containerModal, Rosen::Rect& buttons)>&& callback)314 virtual void SubscribeContainerModalButtonsRectChange( 315 std::function<void(Rosen::Rect& containerModal, Rosen::Rect& buttons)>&& callback) {} 316 SetUIExtensionSubWindow(bool isUIExtensionSubWindow)317 virtual void SetUIExtensionSubWindow(bool isUIExtensionSubWindow) {} 318 IsUIExtensionSubWindow()319 virtual bool IsUIExtensionSubWindow() 320 { 321 return false; 322 } 323 SetUIExtensionAbilityProcess(bool isUIExtensionAbilityProcess)324 virtual void SetUIExtensionAbilityProcess(bool isUIExtensionAbilityProcess) {} 325 IsUIExtensionAbilityProcess()326 virtual bool IsUIExtensionAbilityProcess() 327 { 328 return false; 329 } 330 SetUIExtensionAbilityHost(bool isUIExtensionAbilityHost)331 virtual void SetUIExtensionAbilityHost(bool isUIExtensionAbilityHost) {} 332 IsUIExtensionAbilityHost()333 virtual bool IsUIExtensionAbilityHost() 334 { 335 return false; 336 } 337 338 #ifndef PREVIEW SearchElementInfoByAccessibilityId( int64_t elementId, int32_t mode, int64_t baseParent, std::list<Accessibility::AccessibilityElementInfo>& output)339 virtual void SearchElementInfoByAccessibilityId( 340 int64_t elementId, int32_t mode, 341 int64_t baseParent, std::list<Accessibility::AccessibilityElementInfo>& output) {}; 342 SearchElementInfosByText( int64_t elementId, const std::string& text, int64_t baseParent, std::list<Accessibility::AccessibilityElementInfo>& output)343 virtual void SearchElementInfosByText( 344 int64_t elementId, const std::string& text, int64_t baseParent, 345 std::list<Accessibility::AccessibilityElementInfo>& output) {}; 346 FindFocusedElementInfo( int64_t elementId, int32_t focusType, int64_t baseParent, Accessibility::AccessibilityElementInfo& output)347 virtual void FindFocusedElementInfo( 348 int64_t elementId, int32_t focusType, 349 int64_t baseParent, Accessibility::AccessibilityElementInfo& output) {}; 350 FocusMoveSearch( int64_t elementId, int32_t direction, int64_t baseParent, Accessibility::AccessibilityElementInfo& output)351 virtual void FocusMoveSearch( 352 int64_t elementId, int32_t direction, 353 int64_t baseParent, Accessibility::AccessibilityElementInfo& output) {}; 354 NotifyExecuteAction(int64_t elementId, const std::map<std::string, std::string>& actionArguments, int32_t action, int64_t offset)355 virtual bool NotifyExecuteAction(int64_t elementId, const std::map<std::string, std::string>& actionArguments, 356 int32_t action, int64_t offset) 357 { 358 return false; 359 } 360 HandleAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType, int32_t eventType, int64_t timeMs)361 virtual void HandleAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType, 362 int32_t eventType, int64_t timeMs) {} 363 #endif 364 365 /** 366 * @description: Set UIContent callback after layout finish. 367 * @param callback callback func. 368 */ SetFrameLayoutFinishCallback(std::function<void()>&& callback)369 virtual void SetFrameLayoutFinishCallback(std::function<void()>&& callback) {}; 370 371 /** 372 * @description: Set UIContent callback after lastest layout finish. 373 * @param callback callback func. 374 */ SetLastestFrameLayoutFinishCallback(std::function<void()>&& callback)375 virtual void SetLastestFrameLayoutFinishCallback(std::function<void()>&& callback) {}; 376 377 // Current paintSize of window GetAppPaintSize(OHOS::Rosen::Rect& paintrect)378 virtual void GetAppPaintSize(OHOS::Rosen::Rect& paintrect) {}; 379 380 // Get paintSize of window by calculating GetWindowPaintSize(OHOS::Rosen::Rect& paintrect)381 virtual void GetWindowPaintSize(OHOS::Rosen::Rect& paintrect) {}; 382 383 /** 384 * @description: Create a custom popup with UIExtensionComponent. 385 * @param want Indicates the want of UIExtensionAbility. 386 * @param callbacks Indicates the UIExtensionComponent callbacks. 387 * @param config Indicates the custom popup configs. 388 * @return The return value is the ID of the UI node which bind the pupop 389 * if creation is not successful, it returns 0 by default. 390 */ CreateCustomPopupUIExtension( const AAFwk::Want& want, const ModalUIExtensionCallbacks& callbacks, const CustomPopupUIExtensionConfig& config)391 virtual int32_t CreateCustomPopupUIExtension( 392 const AAFwk::Want& want, const ModalUIExtensionCallbacks& callbacks, const CustomPopupUIExtensionConfig& config) 393 { 394 return 0; 395 } 396 397 /** 398 * @description: Destroy the custom popup. 399 * @param config Indicates the ID of the UI node which bind the pupop 400 */ DestroyCustomPopupUIExtension(int32_t nodeId)401 virtual void DestroyCustomPopupUIExtension(int32_t nodeId) {} 402 403 /** 404 * @description: Update the custom popup. 405 * @param config Indicates the custom popup configs. 406 */ UpdateCustomPopupUIExtension(const CustomPopupUIExtensionConfig& config)407 virtual void UpdateCustomPopupUIExtension(const CustomPopupUIExtensionConfig& config) {} 408 GetFormSerializedGesture()409 virtual SerializedGesture GetFormSerializedGesture() 410 { 411 return SerializedGesture(); 412 } 413 ProcessPointerEventWithCallback( const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent, const std::function<void()>& callback)414 virtual bool ProcessPointerEventWithCallback( 415 const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent, const std::function<void()>& callback) 416 { 417 return true; 418 }; 419 UpdateTransform(const OHOS::Rosen::Transform& transform)420 virtual void UpdateTransform(const OHOS::Rosen::Transform& transform) {}; 421 UpdateDecorVisible(bool visible, bool hasDeco = true)422 virtual void UpdateDecorVisible(bool visible, bool hasDeco = true) {}; 423 GetOverlayNodePositions() const424 virtual std::vector<Ace::RectF> GetOverlayNodePositions() const 425 { 426 return {}; 427 }; 428 RegisterOverlayNodePositionsUpdateCallback( const std::function<void(std::vector<Ace::RectF>)>& callback) const429 virtual void RegisterOverlayNodePositionsUpdateCallback( 430 const std::function<void(std::vector<Ace::RectF>)>& callback) const {}; 431 SetContentNodeGrayScale(float grayscale)432 virtual void SetContentNodeGrayScale(float grayscale) {}; 433 GetRemoteObj()434 virtual sptr<IRemoteObject> GetRemoteObj() 435 { 436 return {}; 437 } 438 PreLayout()439 virtual void PreLayout() {}; 440 SetStatusBarItemColor(uint32_t color)441 virtual void SetStatusBarItemColor(uint32_t color) {}; 442 SetForceSplitEnable(bool isForceSplit, const std::string& homePage)443 virtual void SetForceSplitEnable(bool isForceSplit, const std::string& homePage) {}; 444 }; 445 446 } // namespace OHOS::Ace 447 448 #endif // FOUNDATION_ACE_INTERFACE_INNERKITS_ACE_UI_CONTENT_H 449