1 /* 2 * Copyright (c) 2021-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 FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_ACE_UI_CONTENT_IMPL_H 17 #define FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_ACE_UI_CONTENT_IMPL_H 18 19 #include <list> 20 21 #include "ability_info.h" 22 #include "display_manager.h" 23 #include "dm/display_manager.h" 24 #include "interfaces/inner_api/ace/arkui_rect.h" 25 #include "interfaces/inner_api/ace/ui_content.h" 26 #include "interfaces/inner_api/ace/viewport_config.h" 27 #include "interfaces/inner_api/ui_session/ui_content_stub_impl.h" 28 #include "key_event.h" 29 #include "native_engine/native_engine.h" 30 #include "native_engine/native_value.h" 31 #include "wm/window.h" 32 33 #include "adapter/ohos/entrance/distributed_ui_manager.h" 34 #include "adapter/ohos/entrance/ace_viewport_config.h" 35 #include "base/thread/task_executor.h" 36 #include "base/view_data/view_data_wrap.h" 37 #include "core/common/asset_manager_impl.h" 38 #include "core/common/render_boundary_manager.h" 39 #include "core/common/update_config_manager.h" 40 #include "core/components/common/properties/animation_option.h" 41 #include "core/components/common/properties/popup_param.h" 42 #include "iremote_object.h" 43 44 namespace OHOS::Accessibility { 45 class AccessibilityElementInfo; 46 } 47 48 namespace OHOS::Ace { 49 class ACE_FORCE_EXPORT UIContentImpl : public UIContent { 50 public: 51 UIContentImpl(OHOS::AbilityRuntime::Context* context, void* runtime); 52 UIContentImpl(OHOS::AppExecFwk::Ability* ability); 53 UIContentImpl(OHOS::AbilityRuntime::Context* context, void* runtime, bool isCard); ~UIContentImpl()54 ~UIContentImpl() 55 { 56 UnSubscribeEventsPassThroughMode(); 57 ProcessDestructCallbacks(); 58 DestroyUIDirector(); 59 DestroyCallback(); 60 } 61 62 // UI content lifeCycles 63 UIContentErrorCode Initialize(OHOS::Rosen::Window* window, const std::string& url, napi_value storage) override; 64 UIContentErrorCode Initialize( 65 OHOS::Rosen::Window* window, const std::shared_ptr<std::vector<uint8_t>>& content, napi_value storage) override; 66 UIContentErrorCode Initialize(OHOS::Rosen::Window* window, const std::shared_ptr<std::vector<uint8_t>>& content, 67 napi_value storage, const std::string& contentName) override; 68 UIContentErrorCode InitializeByName( 69 OHOS::Rosen::Window* window, const std::string& name, napi_value storage) override; 70 void InitializeDynamic(const std::string& hapPath, const std::string& abcPath, const std::string& entryPoint, 71 const std::vector<std::string>& registerComponents) override; 72 void Initialize( 73 OHOS::Rosen::Window* window, const std::string& url, napi_value storage, uint32_t focusWindowId) override; 74 void Foreground() override; 75 void Background() override; 76 void Focus() override; 77 void UnFocus() override; 78 void Destroy() override; 79 void OnNewWant(const OHOS::AAFwk::Want& want) override; 80 81 // restore 82 UIContentErrorCode Restore(OHOS::Rosen::Window* window, const std::string& contentInfo, 83 napi_value storage, ContentInfoType type) override; 84 std::string GetContentInfo(ContentInfoType type) const override; 85 void DestroyUIDirector() override; 86 void SetUIContentType(UIContentType uIContentType) override; 87 void UpdateFontScale(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config); 88 89 // UI content event process 90 bool ProcessBackPressed() override; 91 void UpdateDialogResourceConfiguration(RefPtr<Container>& container, 92 const std::shared_ptr<OHOS::AbilityRuntime::Context>& context); 93 bool ProcessPointerEvent(const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent) override; 94 bool ProcessPointerEventWithCallback( 95 const std::shared_ptr<OHOS::MMI::PointerEvent>& pointerEvent, const std::function<void()>& callback) override; 96 bool ProcessKeyEvent(const std::shared_ptr<OHOS::MMI::KeyEvent>& keyEvent, bool isPreIme) override; 97 bool ProcessAxisEvent(const std::shared_ptr<OHOS::MMI::AxisEvent>& axisEvent) override; 98 bool ProcessVsyncEvent(uint64_t timeStampNanos) override; 99 void UpdateConfiguration(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config) override; 100 void UpdateViewportConfig(const ViewportConfig& config, OHOS::Rosen::WindowSizeChangeReason reason, 101 const std::shared_ptr<OHOS::Rosen::RSTransaction>& rsTransaction = nullptr, 102 const std::map<OHOS::Rosen::AvoidAreaType, OHOS::Rosen::AvoidArea>& avoidAreas = {}) override; 103 void UpdateViewportConfigWithAnimation(const ViewportConfig& config, OHOS::Rosen::WindowSizeChangeReason reason, 104 AnimationOption animationOpt, const std::shared_ptr<OHOS::Rosen::RSTransaction>& rsTransaction = nullptr, 105 const std::map<OHOS::Rosen::AvoidAreaType, OHOS::Rosen::AvoidArea>& avoidAreas = {}); 106 void UpdateWindowMode(OHOS::Rosen::WindowMode mode, bool hasDeco = true) override; 107 void UpdateDecorVisible(bool visible, bool hasDeco) override; 108 void UpdateWindowBlur(); 109 void HideWindowTitleButton(bool hideSplit, bool hideMaximize, bool hideMinimize, bool hideClose) override; 110 void SetIgnoreViewSafeArea(bool ignoreViewSafeArea) override; 111 void UpdateMaximizeMode(OHOS::Rosen::MaximizeMode mode) override; 112 void ProcessFormVisibleChange(bool isVisible) override; 113 void UpdateTitleInTargetPos(bool isShow, int32_t height) override; 114 void NotifyRotationAnimationEnd() override; 115 116 void ChangeSensitiveNodes(bool isSensitive) override; 117 118 // Window color 119 uint32_t GetBackgroundColor() override; 120 void SetBackgroundColor(uint32_t color) override; 121 122 bool NeedSoftKeyboard() override; 123 124 void SetOnWindowFocused(const std::function<void()>& callback) override; 125 126 // Current paintSize of window 127 void GetAppPaintSize(OHOS::Rosen::Rect& paintrect) override; 128 129 // Get paintSize of window by calculating 130 void GetWindowPaintSize(OHOS::Rosen::Rect& paintrect) override; 131 132 void DumpInfo(const std::vector<std::string>& params, std::vector<std::string>& info) override; 133 134 // Set UIContent callback for custom window animation 135 void SetNextFrameLayoutCallback(std::function<void()>&& callback) override; 136 137 // Set UIContent callback after layout finish 138 void SetFrameLayoutFinishCallback(std::function<void()>&& callback) override; 139 140 // Receive memory level notification 141 void NotifyMemoryLevel(int32_t level) override; 142 143 void SetAppWindowTitle(const std::string& title) override; 144 void SetAppWindowIcon(const std::shared_ptr<Media::PixelMap>& pixelMap) override; 145 146 // ArkTS Form 147 void PreInitializeForm(OHOS::Rosen::Window* window, const std::string& url, napi_value storage) override; 148 void RunFormPage() override; 149 std::shared_ptr<Rosen::RSSurfaceNode> GetFormRootNode() override; 150 void UpdateFormData(const std::string& data) override; 151 void UpdateFormSharedImage(const std::map<std::string, sptr<OHOS::AppExecFwk::FormAshmem>>& imageDataMap) override; 152 void ReloadForm(const std::string& url) override; 153 SetFormWidth(float width)154 void SetFormWidth(float width) override 155 { 156 formWidth_ = width; 157 } SetFormHeight(float height)158 void SetFormHeight(float height) override 159 { 160 formHeight_ = height; 161 } GetFormWidth()162 float GetFormWidth() override 163 { 164 return formWidth_; 165 } GetFormHeight()166 float GetFormHeight() override 167 { 168 return formHeight_; 169 } 170 171 void SetActionEventHandler(std::function<void(const std::string& action)>&& actionCallback) override; 172 void SetErrorEventHandler(std::function<void(const std::string&, const std::string&)>&& errorCallback) override; 173 void SetFormLinkInfoUpdateHandler(std::function<void(const std::vector<std::string>&)>&& callback) override; 174 175 void OnFormSurfaceChange(float width, float height, 176 OHOS::Rosen::WindowSizeChangeReason type = static_cast<OHOS::Rosen::WindowSizeChangeReason>(0), 177 const std::shared_ptr<Rosen::RSTransaction>& rsTransaction = nullptr) override; 178 179 void SetFormBackgroundColor(const std::string& color) override; 180 181 void RegisterAccessibilityChildTree( 182 uint32_t parentWindowId, int32_t parentTreeId, int64_t parentElementId) override; 183 void SetAccessibilityGetParentRectHandler(std::function<void(int32_t&, int32_t&)>&& callback) override; 184 void SetAccessibilityGetParentRectHandler( 185 std::function<void(AccessibilityParentRectInfo&)>&& callback) override; 186 void DeregisterAccessibilityChildTree() override; 187 void AccessibilityDumpChildInfo(const std::vector<std::string>& params, std::vector<std::string>& info) override; 188 189 void SetFontScaleFollowSystem(const bool fontScaleFollowSystem) override; 190 DumpUITree()191 SerializeableObjectArray DumpUITree() override 192 { 193 return uiManager_->DumpUITree(); 194 } SubscribeUpdate(const std::function<void (int32_t,SerializeableObjectArray &)> & onUpdate)195 void SubscribeUpdate(const std::function<void(int32_t, SerializeableObjectArray&)>& onUpdate) override 196 { 197 return uiManager_->SubscribeUpdate(onUpdate); 198 } UnSubscribeUpdate()199 void UnSubscribeUpdate() override 200 { 201 uiManager_->UnSubscribeUpdate(); 202 } ProcessSerializeableInputEvent(const SerializeableObjectArray & array)203 void ProcessSerializeableInputEvent(const SerializeableObjectArray& array) override 204 { 205 uiManager_->ProcessSerializeableInputEvent(array); 206 } RestoreUITree(const SerializeableObjectArray & array)207 void RestoreUITree(const SerializeableObjectArray& array) override 208 { 209 uiManager_->RestoreUITree(array); 210 } UpdateUITree(const SerializeableObjectArray & array)211 void UpdateUITree(const SerializeableObjectArray& array) override 212 { 213 uiManager_->UpdateUITree(array); 214 } SubscribeInputEventProcess(const std::function<void (SerializeableObjectArray &)> & onEvent)215 void SubscribeInputEventProcess(const std::function<void(SerializeableObjectArray&)>& onEvent) override 216 { 217 uiManager_->SubscribeInputEventProcess(onEvent); 218 } UnSubscribeInputEventProcess()219 void UnSubscribeInputEventProcess() override 220 { 221 uiManager_->UnSubscribeInputEventProcess(); 222 } 223 void GetResourcePaths(std::vector<std::string>& resourcesPaths, std::string& assetRootPath, 224 std::vector<std::string>& assetBasePaths, std::string& resFolderName) override; 225 void SetResourcePaths(const std::vector<std::string>& resourcesPaths, const std::string& assetRootPath, 226 const std::vector<std::string>& assetBasePaths) override; 227 228 napi_value GetUINapiContext() override; 229 void SetIsFocusActive(bool isFocusActive) override; 230 231 void UpdateResource() override; 232 233 int32_t CreateModalUIExtension(const AAFwk::Want& want, 234 const ModalUIExtensionCallbacks& callbacks, const ModalUIExtensionConfig& config) override; 235 void CloseModalUIExtension(int32_t sessionId) override; 236 void UpdateModalUIExtensionConfig( 237 int32_t sessionId, const ModalUIExtensionAllowedUpdateConfig& config) override; 238 239 void SetParentToken(sptr<IRemoteObject> token) override; 240 sptr<IRemoteObject> GetParentToken() override; 241 AbilityBase::AutoFillType ViewDataToType(const AbilityBase::ViewData& viewData); 242 bool DumpViewData(AbilityBase::ViewData& viewData, AbilityBase::AutoFillType& type) override; 243 bool CheckNeedAutoSave() override; 244 bool DumpViewData(const RefPtr<NG::FrameNode>& node, RefPtr<ViewDataWrap> viewDataWrap, 245 bool skipSubAutoFillContainer = false, bool needsRecordData = false); 246 247 void SearchElementInfoByAccessibilityId( 248 int64_t elementId, int32_t mode, 249 int64_t baseParent, std::list<Accessibility::AccessibilityElementInfo>& output) override; 250 251 void SearchElementInfosByText( 252 int64_t elementId, const std::string& text, int64_t baseParent, 253 std::list<Accessibility::AccessibilityElementInfo>& output) override; 254 255 void FindFocusedElementInfo( 256 int64_t elementId, int32_t focusType, 257 int64_t baseParent, Accessibility::AccessibilityElementInfo& output) override; 258 259 void FocusMoveSearch( 260 int64_t elementId, int32_t direction, 261 int64_t baseParent, Accessibility::AccessibilityElementInfo& output) override; 262 263 bool NotifyExecuteAction(int64_t elementId, const std::map<std::string, std::string>& actionArguments, 264 int32_t action, int64_t offset) override; 265 266 void HandleAccessibilityHoverEvent(float pointX, float pointY, int32_t sourceType, 267 int32_t eventType, int64_t timeMs) override; 268 GetInstanceId()269 int32_t GetInstanceId() override 270 { 271 return instanceId_; 272 } 273 274 std::string RecycleForm() override; 275 276 void RecoverForm(const std::string& statusData) override; 277 Shadow GetPopupShadow(); 278 279 int32_t CreateCustomPopupUIExtension(const AAFwk::Want& want, 280 const ModalUIExtensionCallbacks& callbacks, const CustomPopupUIExtensionConfig& config) override; 281 bool GetTargetNode( 282 int32_t& nodeIdLabel, RefPtr<NG::FrameNode>& targetNode, const CustomPopupUIExtensionConfig& config); 283 void DestroyCustomPopupUIExtension(int32_t nodeId) override; 284 void UpdateCustomPopupUIExtension(const CustomPopupUIExtensionConfig& config) override; 285 286 void SetContainerModalTitleVisible(bool customTitleSettedShow, bool floatingTitleSettedShow) override; 287 void SetContainerModalTitleHeight(int32_t height) override; 288 int32_t GetContainerModalTitleHeight() override; 289 bool GetContainerModalButtonsRect(Rosen::Rect& containerModal, Rosen::Rect& buttons) override; 290 void SubscribeContainerModalButtonsRectChange( 291 std::function<void(Rosen::Rect& containerModal, Rosen::Rect& buttons)>&& callback) override; 292 void UpdateTransform(const OHOS::Rosen::Transform& transform) override; 293 294 SerializedGesture GetFormSerializedGesture() override; 295 SetUIExtensionSubWindow(bool isUIExtensionSubWindow)296 void SetUIExtensionSubWindow(bool isUIExtensionSubWindow) override 297 { 298 isUIExtensionSubWindow_ = isUIExtensionSubWindow; 299 } 300 IsUIExtensionSubWindow()301 bool IsUIExtensionSubWindow() override 302 { 303 return isUIExtensionSubWindow_; 304 } 305 SetUIExtensionAbilityProcess(bool isUIExtensionAbilityProcess)306 void SetUIExtensionAbilityProcess(bool isUIExtensionAbilityProcess) override 307 { 308 isUIExtensionAbilityProcess_ = isUIExtensionAbilityProcess; 309 } 310 IsUIExtensionAbilityProcess()311 bool IsUIExtensionAbilityProcess() override 312 { 313 return isUIExtensionAbilityProcess_; 314 } 315 SetUIExtensionAbilityHost(bool isUIExtensionAbilityHost)316 void SetUIExtensionAbilityHost(bool isUIExtensionAbilityHost) override 317 { 318 isUIExtensionAbilityHost_ = isUIExtensionAbilityHost; 319 } 320 IsUIExtensionAbilityHost()321 bool IsUIExtensionAbilityHost() override 322 { 323 return isUIExtensionAbilityHost_; 324 } 325 326 std::vector<Ace::RectF> GetOverlayNodePositions() const override; 327 328 void RegisterOverlayNodePositionsUpdateCallback( 329 const std::function<void(std::vector<Ace::RectF>)>& callback) const override; 330 331 void SetContentNodeGrayScale(float grayscale) override; 332 333 void SetFormRenderingMode(int8_t renderMode) override; 334 335 void PreLayout() override; 336 337 void SetFontScaleAndWeightScale(const RefPtr<Platform::AceContainer>& container, int32_t instanceId); 338 339 void SetStatusBarItemColor(uint32_t color) override; 340 341 void SetForceSplitEnable(bool isForceSplit, const std::string& homePage) override; 342 343 void UpdateDialogContainerConfig(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config); 344 GetRemoteObj()345 sptr<IRemoteObject> GetRemoteObj() override 346 { 347 return instance_; 348 } 349 AddDestructCallback(void * key,const std::function<void ()> & callback)350 void AddDestructCallback(void* key, const std::function<void()>& callback) 351 { 352 destructCallbacks_.emplace(key, callback); 353 } 354 RemoveDestructCallback(void * key)355 void RemoveDestructCallback(void* key) 356 { 357 destructCallbacks_.erase(key); 358 } 359 360 void EnableContainerModalGesture(bool isEnable) override; 361 362 bool GetContainerFloatingTitleVisible() override; 363 364 bool GetContainerCustomTitleVisible() override; 365 366 bool GetContainerControlButtonVisible() override; 367 368 void UpdateSingleHandTransform(const OHOS::Rosen::SingleHandTransform& transform) override; 369 370 void UpdateConfigurationSyncForAll(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config) override; 371 372 std::shared_ptr<Rosen::RSNode> GetRSNodeByStringID(const std::string& stringId) override; 373 void SetTopWindowBoundaryByID(const std::string& stringId) override; 374 private: 375 UIContentErrorCode InitializeInner( 376 OHOS::Rosen::Window* window, const std::string& contentInfo, napi_value storage, bool isNamedRouter); 377 UIContentErrorCode CommonInitialize( 378 OHOS::Rosen::Window* window, const std::string& contentInfo, napi_value storage, uint32_t focusWindowId = 0); 379 UIContentErrorCode CommonInitializeForm( 380 OHOS::Rosen::Window* window, const std::string& contentInfo, napi_value storage); 381 void InitializeSubWindow(OHOS::Rosen::Window* window, bool isDialog = false); 382 void DestroyCallback() const; 383 void ProcessDestructCallbacks(); 384 void SetConfiguration(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config); 385 386 void InitializeSafeArea(const RefPtr<Platform::AceContainer>& container); 387 void InitializeDisplayAvailableRect(const RefPtr<Platform::AceContainer>& container); 388 389 void InitDragSummaryMap(const RefPtr<Platform::AceContainer>& container); 390 391 RefPtr<PopupParam> CreateCustomPopupParam(bool isShow, const CustomPopupUIExtensionConfig& config); 392 void OnPopupStateChange(const std::string& event, const CustomPopupUIExtensionConfig& config, int32_t nodeId); 393 void SetCustomPopupConfig(int32_t nodeId, const CustomPopupUIExtensionConfig& config, int32_t popupId); 394 395 void RenderLayoutBoundary(bool isDebugBoundary); 396 static void EnableSystemParameterTraceLayoutCallback(const char* key, const char* value, void* context); 397 static void EnableSystemParameterSecurityDevelopermodeCallback(const char* key, const char* value, void* context); 398 static void EnableSystemParameterDebugStatemgrCallback(const char* key, const char* value, void* context); 399 static void EnableSystemParameterDebugBoundaryCallback(const char* key, const char* value, void* context); 400 static void EnableSystemParameterTraceInputEventCallback(const char* key, const char* value, void* context); 401 void AddWatchSystemParameter(); 402 void StoreConfiguration(const std::shared_ptr<OHOS::AppExecFwk::Configuration>& config); 403 void UnregisterDisplayManagerCallback(); 404 void SubscribeEventsPassThroughMode(); 405 void UnSubscribeEventsPassThroughMode(); 406 bool GetWindowSizeChangeReason(OHOS::Rosen::WindowSizeChangeReason lastReason, 407 OHOS::Rosen::WindowSizeChangeReason reason); 408 409 std::weak_ptr<OHOS::AbilityRuntime::Context> context_; 410 void* runtime_ = nullptr; 411 OHOS::Rosen::Window* window_ = nullptr; 412 std::string startUrl_; 413 int32_t instanceId_ = -1; 414 OHOS::sptr<OHOS::Rosen::IWindowDragListener> dragWindowListener_ = nullptr; 415 OHOS::sptr<OHOS::Rosen::IOccupiedAreaChangeListener> occupiedAreaChangeListener_ = nullptr; 416 OHOS::sptr<OHOS::Rosen::IAvoidAreaChangedListener> avoidAreaChangedListener_ = nullptr; 417 OHOS::sptr<OHOS::Rosen::DisplayManager::IFoldStatusListener> foldStatusListener_ = nullptr; 418 OHOS::sptr<OHOS::Rosen::DisplayManager::IDisplayModeListener> foldDisplayModeListener_ = nullptr; 419 OHOS::sptr<OHOS::Rosen::DisplayManager::IAvailableAreaListener> availableAreaChangedListener_ = nullptr; 420 421 // ITouchOutsideListener is used for touching out of hot areas of window. 422 OHOS::sptr<OHOS::Rosen::ITouchOutsideListener> touchOutsideListener_ = nullptr; 423 424 // ArkTS Form 425 bool isFormRender_ = false; 426 bool isFormRenderInit_ = false; 427 std::string bundleName_; 428 std::string moduleName_; 429 std::string hapPath_; 430 bool isBundle_ = false; 431 float formWidth_ = 0.0; 432 float formHeight_ = 0.0; 433 std::string formData_; 434 bool fontScaleFollowSystem_ = true; 435 std::map<std::string, sptr<OHOS::AppExecFwk::FormAshmem>> formImageDataMap_; 436 std::unordered_map<int32_t, CustomPopupUIExtensionConfig> customPopupConfigMap_; 437 std::unordered_map<int32_t, int32_t> popupUIExtensionRecords_; 438 std::unique_ptr<DistributedUIManager> uiManager_; 439 440 bool isDynamicRender_ = false; 441 UIContentType uIContentType_ = UIContentType::UNDEFINED; 442 std::shared_ptr<TaskWrapper> taskWrapper_; 443 std::vector<std::string> registerComponents_; 444 445 sptr<IRemoteObject> parentToken_ = nullptr; 446 sptr<IRemoteObject> instance_ = new (std::nothrow) UIContentServiceStubImpl(); 447 RefPtr<RenderBoundaryManager> renderBoundaryManager_ = Referenced::MakeRefPtr<RenderBoundaryManager>(); 448 bool isUIExtensionSubWindow_ = false; 449 bool isUIExtensionAbilityProcess_ = false; 450 bool isUIExtensionAbilityHost_ = false; 451 RefPtr<UpdateConfigManager<AceViewportConfig>> viewportConfigMgr_ = 452 Referenced::MakeRefPtr<UpdateConfigManager<AceViewportConfig>>(); 453 std::unordered_map<void*, std::function<void()>> destructCallbacks_; 454 455 SingleTaskExecutor::CancelableTask updateDecorVisibleTask_; 456 std::mutex updateDecorVisibleMutex_; 457 OHOS::Rosen::WindowSizeChangeReason lastReason_ = OHOS::Rosen::WindowSizeChangeReason::UNDEFINED; 458 }; 459 460 } // namespace OHOS::Ace 461 462 #endif // FOUNDATION_ACE_ADAPTER_OHOS_ENTRANCE_ACE_UI_CONTENT_IMPL_H 463