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 class NativeEngine; 89 typedef struct napi_value__* napi_value; 90 91 namespace OHOS::Ace { 92 class ACE_FORCE_EXPORT UIContent { 93 public: 94 static std::unique_ptr<UIContent> Create( 95 OHOS::AbilityRuntime::Context* context, NativeEngine* runtime, bool isFormRender); 96 static std::unique_ptr<UIContent> Create(OHOS::AbilityRuntime::Context* context, NativeEngine* runtime); 97 static std::unique_ptr<UIContent> Create(OHOS::AppExecFwk::Ability* ability); 98 static void ShowDumpHelp(std::vector<std::string>& info); 99 static UIContent* GetUIContent(int32_t instanceId); 100 static std::string GetCurrentUIStackInfo(); 101 102 virtual ~UIContent() = default; 103 104 // UI content life-cycles 105 virtual UIContentErrorCode Initialize(OHOS::Rosen::Window* window, const std::string& url, napi_value storage) = 0; 106 virtual UIContentErrorCode Initialize( 107 OHOS::Rosen::Window* window, const std::shared_ptr<std::vector<uint8_t>>& content, napi_value storage) = 0; Initialize(OHOS::Rosen::Window * window,const std::shared_ptr<std::vector<uint8_t>> & content,napi_value storage,const std::string & contentName)108 virtual UIContentErrorCode Initialize(OHOS::Rosen::Window* window, 109 const std::shared_ptr<std::vector<uint8_t>>& content, napi_value storage, const std::string& contentName) 110 { 111 return UIContentErrorCode::NO_ERRORS; 112 } 113 virtual UIContentErrorCode InitializeByName(OHOS::Rosen::Window *window, const std::string &name, 114 napi_value storage) = 0; InitializeDynamic(const std::string & hapPath,const std::string & abcPath,const std::string & entryPoint,const std::vector<std::string> & registerComponents)115 virtual void InitializeDynamic(const std::string& hapPath, const std::string& abcPath, 116 const std::string& entryPoint, const std::vector<std::string>& registerComponents) {}; 117 118 // UIExtensionAbility initialize for focusWindow ID 119 virtual void Initialize( 120 OHOS::Rosen::Window* window, const std::string& url, napi_value storage, uint32_t focusWindowID) = 0; 121 virtual void Foreground() = 0; 122 virtual void Background() = 0; 123 virtual void Focus() = 0; 124 virtual void UnFocus() = 0; 125 virtual void Destroy() = 0; 126 virtual void OnNewWant(const OHOS::AAFwk::Want& want) = 0; 127 128 // restore 129 virtual UIContentErrorCode Restore( 130 OHOS::Rosen::Window* window, const std::string& contentInfo, napi_value storage, 131 ContentInfoType type = ContentInfoType::CONTINUATION) = 0; 132 virtual std::string GetContentInfo(ContentInfoType type = ContentInfoType::CONTINUATION) const = 0; 133 virtual void DestroyUIDirector() = 0; 134 135 // UI content event process 136 virtual bool ProcessBackPressed() = 0; 137 virtual bool ProcessPointerEvent(const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent) = 0; 138 virtual bool ProcessKeyEvent(const std::shared_ptr<OHOS::MMI::KeyEvent>& keyEvent, bool isPreIme = false) = 0; 139 virtual bool ProcessAxisEvent(const std::shared_ptr<OHOS::MMI::AxisEvent>& axisEvent) = 0; 140 virtual bool ProcessVsyncEvent(uint64_t timeStampNanos) = 0; 141 virtual void SetIsFocusActive(bool isFocusActive) = 0; 142 virtual void UpdateConfiguration(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config) = 0; 143 virtual void UpdateViewportConfig(const ViewportConfig& config, OHOS::Rosen::WindowSizeChangeReason reason, 144 const std::shared_ptr<OHOS::Rosen::RSTransaction>& rsTransaction = nullptr, 145 const std::map<OHOS::Rosen::AvoidAreaType, OHOS::Rosen::AvoidArea>& avoidAreas = {}) {}; 146 virtual void UpdateWindowMode(OHOS::Rosen::WindowMode mode, bool hasDeco = true) = 0; 147 virtual void HideWindowTitleButton(bool hideSplit, bool hideMaximize, bool hideMinimize, bool hideClose) = 0; 148 virtual void SetIgnoreViewSafeArea(bool ignoreViewSafeArea) = 0; UpdateMaximizeMode(OHOS::Rosen::MaximizeMode mode)149 virtual void UpdateMaximizeMode(OHOS::Rosen::MaximizeMode mode) {}; ProcessFormVisibleChange(bool isVisible)150 virtual void ProcessFormVisibleChange(bool isVisible) {}; NotifyRotationAnimationEnd()151 virtual void NotifyRotationAnimationEnd() {}; 152 153 // only vaild in ContainerModalPatternEnhance 154 virtual void UpdateTitleInTargetPos(bool isShow, int32_t height) = 0; 155 156 // Window color 157 virtual uint32_t GetBackgroundColor() = 0; 158 virtual void SetBackgroundColor(uint32_t color) = 0; SetUIContentType(UIContentType uIContentType)159 virtual void SetUIContentType(UIContentType uIContentType) {}; 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) {}; 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) {}; DeregisterAccessibilityChildTree()209 virtual void DeregisterAccessibilityChildTree() {}; AccessibilityDumpChildInfo(const std::vector<std::string> & params,std::vector<std::string> & info)210 virtual void AccessibilityDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info) {}; 211 212 // for distribute UI source DumpUITree()213 virtual SerializeableObjectArray DumpUITree() 214 { 215 return SerializeableObjectArray(); 216 }; SubscribeUpdate(const std::function<void (int32_t,SerializeableObjectArray &)> & onUpdate)217 virtual void SubscribeUpdate(const std::function<void(int32_t, SerializeableObjectArray&)>& onUpdate) {} UnSubscribeUpdate()218 virtual void UnSubscribeUpdate() {} ProcessSerializeableInputEvent(const SerializeableObjectArray & array)219 virtual void ProcessSerializeableInputEvent(const SerializeableObjectArray& array) {} 220 // for distribute UI sink RestoreUITree(const SerializeableObjectArray & array)221 virtual void RestoreUITree(const SerializeableObjectArray& array) {} UpdateUITree(const SerializeableObjectArray & array)222 virtual void UpdateUITree(const SerializeableObjectArray& array) {} SubscribeInputEventProcess(const std::function<void (SerializeableObjectArray &)> & onEvent)223 virtual void SubscribeInputEventProcess(const std::function<void(SerializeableObjectArray&)>& onEvent) {} UnSubscribeInputEventProcess()224 virtual void UnSubscribeInputEventProcess() {} 225 GetResourcePaths(std::vector<std::string> & resourcesPaths,std::string & assetRootPath,std::vector<std::string> & assetBasePaths,std::string & resFolderName)226 virtual void GetResourcePaths(std::vector<std::string>& resourcesPaths, std::string& assetRootPath, 227 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)228 virtual void SetResourcePaths(const std::vector<std::string>& resourcesPaths, const std::string& assetRootPath, 229 const std::vector<std::string>& assetBasePaths) {}; 230 UpdateResource()231 virtual void UpdateResource() {} 232 GetUINapiContext()233 virtual napi_value GetUINapiContext() 234 { 235 napi_value result = nullptr; 236 return result; 237 } 238 239 /** 240 * @description: Create a full-window modal UIExtensionComponent. 241 * @param want Indicates the want of UIExtensionAbility. 242 * @param callbacks Indicates the UIExtensionComponent callbacks. 243 * @param config Indicates the Modal page configs. 244 * @return The return value is the ID of the session held by the UIExtensionComponent 245 * if creation is not successful, it returns 0 by default. 246 */ 247 virtual int32_t CreateModalUIExtension( 248 const AAFwk::Want& want, const ModalUIExtensionCallbacks& callbacks, const ModalUIExtensionConfig& config) = 0; 249 250 /** 251 * @description: Close the full-window modal. 252 * @param sessionId Indicates the sessionId of UIExtensionAbility. 253 * If the sessionId is 0, refuse to close 254 */ 255 virtual void CloseModalUIExtension(int32_t sessionId) = 0; 256 UpdateModalUIExtensionConfig(int32_t sessionId,const ModalUIExtensionAllowedUpdateConfig & config)257 virtual void UpdateModalUIExtensionConfig( 258 int32_t sessionId, const ModalUIExtensionAllowedUpdateConfig& config) {}; 259 260 /** 261 * @description: Set parent ability token. 262 * @param token ability token. 263 */ 264 virtual void SetParentToken(sptr<IRemoteObject> token); 265 266 /** 267 * @description: Get parent ability token. 268 * @return return parent ability token. 269 */ 270 virtual sptr<IRemoteObject> GetParentToken(); 271 DumpViewData(AbilityBase::ViewData & viewData,AbilityBase::AutoFillType & type)272 virtual bool DumpViewData(AbilityBase::ViewData& viewData, AbilityBase::AutoFillType& type) 273 { 274 return false; 275 } 276 CheckNeedAutoSave()277 virtual bool CheckNeedAutoSave() 278 { 279 return false; 280 } 281 GetInstanceId()282 virtual int32_t GetInstanceId() 283 { 284 return -1; 285 } 286 287 /** 288 * @description: Recycle form. 289 * @return return Json string of status data of ArkTS form. 290 */ RecycleForm()291 virtual std::string RecycleForm() 292 { 293 return ""; 294 } 295 296 /** 297 * @description: Recover form. 298 * @param statusData Indicates json string of status data of ArkTS form. 299 */ RecoverForm(const std::string & statusData)300 virtual void RecoverForm(const std::string &statusData) {} 301 SetContainerModalTitleVisible(bool customTitleSettedShow,bool floatingTitleSettedShow)302 virtual void SetContainerModalTitleVisible(bool customTitleSettedShow, bool floatingTitleSettedShow) {} 303 SetContainerModalTitleHeight(int height)304 virtual void SetContainerModalTitleHeight(int height) {} 305 GetContainerModalTitleHeight()306 virtual int32_t GetContainerModalTitleHeight() 307 { 308 return -1; 309 } 310 GetContainerModalButtonsRect(Rosen::Rect & containerModal,Rosen::Rect & buttons)311 virtual bool GetContainerModalButtonsRect(Rosen::Rect& containerModal, Rosen::Rect& buttons) 312 { 313 return false; 314 } 315 SubscribeContainerModalButtonsRectChange(std::function<void (Rosen::Rect & containerModal,Rosen::Rect & buttons)> && callback)316 virtual void SubscribeContainerModalButtonsRectChange( 317 std::function<void(Rosen::Rect& containerModal, Rosen::Rect& buttons)>&& callback) {} 318 SetUIExtensionSubWindow(bool isUIExtensionSubWindow)319 virtual void SetUIExtensionSubWindow(bool isUIExtensionSubWindow) {} 320 IsUIExtensionSubWindow()321 virtual bool IsUIExtensionSubWindow() 322 { 323 return false; 324 } 325 SetUIExtensionAbilityProcess(bool isUIExtensionAbilityProcess)326 virtual void SetUIExtensionAbilityProcess(bool isUIExtensionAbilityProcess) {} 327 IsUIExtensionAbilityProcess()328 virtual bool IsUIExtensionAbilityProcess() 329 { 330 return false; 331 } 332 SetUIExtensionAbilityHost(bool isUIExtensionAbilityHost)333 virtual void SetUIExtensionAbilityHost(bool isUIExtensionAbilityHost) {} 334 IsUIExtensionAbilityHost()335 virtual bool IsUIExtensionAbilityHost() 336 { 337 return false; 338 } 339 340 #ifndef PREVIEW SearchElementInfoByAccessibilityId(int64_t elementId,int32_t mode,int64_t baseParent,std::list<Accessibility::AccessibilityElementInfo> & output)341 virtual void SearchElementInfoByAccessibilityId( 342 int64_t elementId, int32_t mode, 343 int64_t baseParent, std::list<Accessibility::AccessibilityElementInfo>& output) {}; 344 SearchElementInfosByText(int64_t elementId,const std::string & text,int64_t baseParent,std::list<Accessibility::AccessibilityElementInfo> & output)345 virtual void SearchElementInfosByText( 346 int64_t elementId, const std::string& text, int64_t baseParent, 347 std::list<Accessibility::AccessibilityElementInfo>& output) {}; 348 FindFocusedElementInfo(int64_t elementId,int32_t focusType,int64_t baseParent,Accessibility::AccessibilityElementInfo & output)349 virtual void FindFocusedElementInfo( 350 int64_t elementId, int32_t focusType, 351 int64_t baseParent, Accessibility::AccessibilityElementInfo& output) {}; 352 FocusMoveSearch(int64_t elementId,int32_t direction,int64_t baseParent,Accessibility::AccessibilityElementInfo & output)353 virtual void FocusMoveSearch( 354 int64_t elementId, int32_t direction, 355 int64_t baseParent, Accessibility::AccessibilityElementInfo& output) {}; 356 NotifyExecuteAction(int64_t elementId,const std::map<std::string,std::string> & actionArguments,int32_t action,int64_t offset)357 virtual bool NotifyExecuteAction(int64_t elementId, const std::map<std::string, std::string>& actionArguments, 358 int32_t action, int64_t offset) 359 { 360 return false; 361 } 362 HandleAccessibilityHoverEvent(float pointX,float pointY,int32_t sourceType,int32_t eventType,int64_t timeMs)363 virtual void HandleAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType, 364 int32_t eventType, int64_t timeMs) {} 365 #endif 366 367 /** 368 * @description: Set UIContent callback after layout finish. 369 * @param callback callback func. 370 */ SetFrameLayoutFinishCallback(std::function<void ()> && callback)371 virtual void SetFrameLayoutFinishCallback(std::function<void()>&& callback) {}; 372 373 // Current paintSize of window GetAppPaintSize(OHOS::Rosen::Rect & paintrect)374 virtual void GetAppPaintSize(OHOS::Rosen::Rect& paintrect) {}; 375 376 // Get paintSize of window by calculating GetWindowPaintSize(OHOS::Rosen::Rect & paintrect)377 virtual void GetWindowPaintSize(OHOS::Rosen::Rect& paintrect) {}; 378 379 /** 380 * @description: Create a custom popup with UIExtensionComponent. 381 * @param want Indicates the want of UIExtensionAbility. 382 * @param callbacks Indicates the UIExtensionComponent callbacks. 383 * @param config Indicates the custom popup configs. 384 * @return The return value is the ID of the UI node which bind the pupop 385 * if creation is not successful, it returns 0 by default. 386 */ CreateCustomPopupUIExtension(const AAFwk::Want & want,const ModalUIExtensionCallbacks & callbacks,const CustomPopupUIExtensionConfig & config)387 virtual int32_t CreateCustomPopupUIExtension( 388 const AAFwk::Want& want, const ModalUIExtensionCallbacks& callbacks, const CustomPopupUIExtensionConfig& config) 389 { 390 return 0; 391 } 392 393 /** 394 * @description: Destroy the custom popup. 395 * @param config Indicates the ID of the UI node which bind the pupop 396 */ DestroyCustomPopupUIExtension(int32_t nodeId)397 virtual void DestroyCustomPopupUIExtension(int32_t nodeId) {} 398 399 /** 400 * @description: Update the custom popup. 401 * @param config Indicates the custom popup configs. 402 */ UpdateCustomPopupUIExtension(const CustomPopupUIExtensionConfig & config)403 virtual void UpdateCustomPopupUIExtension(const CustomPopupUIExtensionConfig& config) {} 404 GetFormSerializedGesture()405 virtual SerializedGesture GetFormSerializedGesture() 406 { 407 return SerializedGesture(); 408 } 409 ProcessPointerEventWithCallback(const std::shared_ptr<OHOS::MMI::PointerEvent> & pointerEvent,const std::function<void ()> & callback)410 virtual bool ProcessPointerEventWithCallback( 411 const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent, const std::function<void()>& callback) 412 { 413 return true; 414 }; 415 UpdateTransform(const OHOS::Rosen::Transform & transform)416 virtual void UpdateTransform(const OHOS::Rosen::Transform& transform) {}; 417 418 virtual void UpdateDecorVisible(bool visible, bool hasDeco = true) {}; 419 GetOverlayNodePositions()420 virtual std::vector<Ace::RectF> GetOverlayNodePositions() const 421 { 422 return {}; 423 }; 424 RegisterOverlayNodePositionsUpdateCallback(const std::function<void (std::vector<Ace::RectF>)> & callback)425 virtual void RegisterOverlayNodePositionsUpdateCallback( 426 const std::function<void(std::vector<Ace::RectF>)>& callback) const {}; 427 SetContentNodeGrayScale(float grayscale)428 virtual void SetContentNodeGrayScale(float grayscale) {}; 429 SetStatusBarItemColor(uint32_t color)430 virtual void SetStatusBarItemColor(uint32_t color) {}; 431 PreLayout()432 virtual void PreLayout() {}; 433 SetForceSplitEnable(bool isForceSplit,const std::string & homePage)434 virtual void SetForceSplitEnable(bool isForceSplit, const std::string& homePage) {}; 435 GetRemoteObj()436 virtual sptr<IRemoteObject> GetRemoteObj() 437 { 438 return {}; 439 } 440 EnableContainerModalGesture(bool isEnable)441 virtual void EnableContainerModalGesture(bool isEnable) {}; 442 GetContainerFloatingTitleVisible()443 virtual bool GetContainerFloatingTitleVisible() 444 { 445 return false; 446 } 447 GetContainerCustomTitleVisible()448 virtual bool GetContainerCustomTitleVisible() 449 { 450 return false; 451 } 452 GetContainerControlButtonVisible()453 virtual bool GetContainerControlButtonVisible() 454 { 455 return false; 456 } 457 UpdateConfigurationSyncForAll(const std::shared_ptr<OHOS::AppExecFwk::Configuration> & config)458 virtual void UpdateConfigurationSyncForAll(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config) {} 459 }; 460 461 } // namespace OHOS::Ace 462 463 #endif // FOUNDATION_ACE_INTERFACE_INNERKITS_ACE_UI_CONTENT_H 464