1 /* 2 * Copyright (c) 2023-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_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_OVERLAY_MODAL_PRESENTATION_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_OVERLAY_MODAL_PRESENTATION_PATTERN_H 18 19 #include "base/memory/ace_type.h" 20 #include "base/memory/referenced.h" 21 #include "core/common/autofill/auto_fill_trigger_state_holder.h" 22 #include "core/components_ng/manager/focus/focus_view.h" 23 #include "core/components_ng/pattern/overlay/modal_style.h" 24 #include "core/components_ng/pattern/overlay/popup_base_pattern.h" 25 26 namespace OHOS::Ace::NG { 27 enum class ContentCoverDismissReason { 28 BACK_PRESSED = 0, 29 TOUCH_OUTSIDE, 30 CLOSE_BUTTON, 31 }; 32 33 class ACE_EXPORT ModalPresentationPattern : public PopupBasePattern, 34 public FocusView, public AutoFillTriggerStateHolder { 35 DECLARE_ACE_TYPE(ModalPresentationPattern, PopupBasePattern, FocusView, AutoFillTriggerStateHolder); 36 37 public: ModalPresentationPattern(int32_t targetId,ModalTransition type,std::function<void (const std::string &)> && callback)38 ModalPresentationPattern(int32_t targetId, ModalTransition type, std::function<void(const std::string&)>&& callback) 39 : targetId_(targetId), type_(type), callback_(std::move(callback)) 40 {} 41 ~ModalPresentationPattern() override = default; 42 IsMeasureBoundary()43 bool IsMeasureBoundary() const override 44 { 45 return true; 46 } 47 IsAtomicNode()48 bool IsAtomicNode() const override 49 { 50 return false; 51 } 52 GetTargetId()53 int32_t GetTargetId() const override 54 { 55 return targetId_; 56 } 57 GetType()58 ModalTransition GetType() const 59 { 60 return type_; 61 } 62 SetType(ModalTransition type)63 void SetType(ModalTransition type) 64 { 65 type_ = type; 66 } 67 FireCallback(const std::string & value)68 void FireCallback(const std::string& value) 69 { 70 if (callback_) { 71 callback_(value); 72 } 73 } 74 SetHasTransitionEffect(const bool hasTransitionEffect)75 void SetHasTransitionEffect(const bool hasTransitionEffect) 76 { 77 hasTransitionEffect_ = hasTransitionEffect; 78 } 79 HasTransitionEffect()80 bool HasTransitionEffect() const 81 { 82 return hasTransitionEffect_; 83 } 84 UpdateOnWillDismiss(const std::function<void (int32_t)> && onWillDismiss)85 void UpdateOnWillDismiss(const std::function<void(int32_t)>&& onWillDismiss) //todo 86 { 87 onWillDismiss_ = std::move(onWillDismiss); 88 } 89 HasOnWillDismiss()90 bool HasOnWillDismiss() const 91 { 92 if (onWillDismiss_) { 93 return true; 94 } 95 return false; 96 } 97 CallOnWillDismiss(const int32_t reason)98 void CallOnWillDismiss(const int32_t reason) 99 { 100 if (onWillDismiss_) { 101 onWillDismiss_(reason); 102 } 103 } 104 105 void ModalInteractiveDismiss(); 106 107 void BeforeCreateLayoutWrapper() override; 108 UpdateOnDisappear(std::function<void ()> && onDisappear)109 void UpdateOnDisappear(std::function<void()>&& onDisappear) { 110 onDisappear_ = std::move(onDisappear); 111 isExecuteOnDisappear_ = false; 112 } 113 OnDisappear()114 void OnDisappear() { 115 if (onDisappear_) { 116 isExecuteOnDisappear_ = true; 117 onDisappear_(); 118 } 119 } 120 UpdateOnWillDisappear(std::function<void ()> && onWillDisappear)121 void UpdateOnWillDisappear(std::function<void()>&& onWillDisappear) 122 { 123 onWillDisappear_ = std::move(onWillDisappear); 124 } 125 126 void OnWillDisappear(); 127 UpdateOnAppear(std::function<void ()> && onAppear)128 void UpdateOnAppear(std::function<void()>&& onAppear) 129 { 130 onAppear_ = std::move(onAppear); 131 } 132 OnAppear()133 void OnAppear() 134 { 135 if (onAppear_) { 136 onAppear_(); 137 } 138 } 139 GetFocusPattern()140 FocusPattern GetFocusPattern() const override 141 { 142 return { FocusType::SCOPE, true }; 143 } 144 GetRouteOfFirstScope()145 std::list<int32_t> GetRouteOfFirstScope() override 146 { 147 return { 0 }; 148 } 149 IsExecuteOnDisappear()150 bool IsExecuteOnDisappear() const 151 { 152 return isExecuteOnDisappear_; 153 } 154 IsUIExtension()155 bool IsUIExtension() const 156 { 157 return isUIExtension_; 158 } 159 SetProhibitedRemoveByRouter(bool prohibitedRemoveByRouter)160 void SetProhibitedRemoveByRouter(bool prohibitedRemoveByRouter) 161 { 162 prohibitedRemoveByRouter_ = prohibitedRemoveByRouter; 163 } 164 IsProhibitedRemoveByRouter()165 bool IsProhibitedRemoveByRouter() const 166 { 167 return prohibitedRemoveByRouter_; 168 } 169 SetProhibitedRemoveByNavigation(bool prohibitedRemoveByNavigation)170 void SetProhibitedRemoveByNavigation(bool prohibitedRemoveByNavigation) 171 { 172 prohibitedRemoveByNavigation_ = prohibitedRemoveByNavigation; 173 } 174 IsProhibitedRemoveByNavigation()175 bool IsProhibitedRemoveByNavigation() const 176 { 177 return prohibitedRemoveByNavigation_; 178 } 179 AvoidKeyboard()180 bool AvoidKeyboard() const override 181 { 182 // If UIExtensionComponent uses ModalPage, ModalPage will avoid KeyBoard. 183 return isUIExtension_; 184 } 185 UpdateUIExtensionMode(bool isUIExtension)186 void UpdateUIExtensionMode(bool isUIExtension) 187 { 188 isUIExtension_ = isUIExtension; 189 } 190 AvoidBottom()191 bool AvoidBottom() const override 192 { 193 // If UIExtensionComponent uses ModalPage, ModalPage will not avoid bottom. 194 return !isUIExtension_; 195 } 196 197 void RegisterModalBgColorResFunc(const RefPtr<NG::FrameNode>& modalNode, 198 NG::ModalStyle& modalStyle); 199 TriggerAutoSaveWhenInvisible()200 bool TriggerAutoSaveWhenInvisible() override 201 { 202 return true; 203 } 204 SetEnableSafeArea(bool enableSafeArea)205 void SetEnableSafeArea(bool enableSafeArea) 206 { 207 enableSafeArea_ = enableSafeArea; 208 } 209 GetEnableSafeArea()210 bool GetEnableSafeArea() const 211 { 212 return enableSafeArea_; 213 } 214 IsEnableChildrenMatchParent()215 bool IsEnableChildrenMatchParent() override 216 { 217 return true; 218 } 219 220 private: 221 void OnAttachToFrameNode() override; 222 bool isUIExtension_ = false; 223 bool prohibitedRemoveByRouter_ = false; 224 bool prohibitedRemoveByNavigation_ = true; 225 int32_t targetId_ = -1; 226 ModalTransition type_ = ModalTransition::DEFAULT; 227 bool hasTransitionEffect_ = false; 228 std::function<void(const int32_t& info)> onWillDismiss_; 229 std::function<void(const std::string&)> callback_; 230 std::function<void()> onDisappear_; 231 std::function<void()> onWillDisappear_; 232 std::function<void()> onAppear_; 233 bool isExecuteOnDisappear_ = false; 234 bool enableSafeArea_ = false; 235 236 ACE_DISALLOW_COPY_AND_MOVE(ModalPresentationPattern); 237 }; 238 } // namespace OHOS::Ace::NG 239 240 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_OVERLAY_MODAL_PRESENTATION_PATTERN_H 241