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 UpdateOnDisappear(std::function<void ()> && onDisappear)107 void UpdateOnDisappear(std::function<void()>&& onDisappear) { 108 onDisappear_ = std::move(onDisappear); 109 isExecuteOnDisappear_ = false; 110 } 111 OnDisappear()112 void OnDisappear() { 113 if (onDisappear_) { 114 isExecuteOnDisappear_ = true; 115 onDisappear_(); 116 } 117 } 118 UpdateOnWillDisappear(std::function<void ()> && onWillDisappear)119 void UpdateOnWillDisappear(std::function<void()>&& onWillDisappear) 120 { 121 onWillDisappear_ = std::move(onWillDisappear); 122 } 123 OnWillDisappear()124 void OnWillDisappear() 125 { 126 if (onWillDisappear_) { 127 onWillDisappear_(); 128 } 129 } 130 UpdateOnAppear(std::function<void ()> && onAppear)131 void UpdateOnAppear(std::function<void()>&& onAppear) 132 { 133 onAppear_ = std::move(onAppear); 134 } 135 OnAppear()136 void OnAppear() 137 { 138 if (onAppear_) { 139 onAppear_(); 140 } 141 } 142 GetFocusPattern()143 FocusPattern GetFocusPattern() const override 144 { 145 return { FocusType::SCOPE, true }; 146 } 147 GetRouteOfFirstScope()148 std::list<int32_t> GetRouteOfFirstScope() override 149 { 150 return { 0 }; 151 } 152 IsExecuteOnDisappear()153 bool IsExecuteOnDisappear() const 154 { 155 return isExecuteOnDisappear_; 156 } 157 IsUIExtension()158 bool IsUIExtension() const 159 { 160 return isUIExtension_; 161 } 162 SetProhibitedRemoveByRouter(bool prohibitedRemoveByRouter)163 void SetProhibitedRemoveByRouter(bool prohibitedRemoveByRouter) 164 { 165 prohibitedRemoveByRouter_ = prohibitedRemoveByRouter; 166 } 167 IsProhibitedRemoveByRouter()168 bool IsProhibitedRemoveByRouter() const 169 { 170 return prohibitedRemoveByRouter_; 171 } 172 SetProhibitedRemoveByNavigation(bool prohibitedRemoveByNavigation)173 void SetProhibitedRemoveByNavigation(bool prohibitedRemoveByNavigation) 174 { 175 prohibitedRemoveByNavigation_ = prohibitedRemoveByNavigation; 176 } 177 IsProhibitedRemoveByNavigation()178 bool IsProhibitedRemoveByNavigation() const 179 { 180 return prohibitedRemoveByNavigation_; 181 } 182 AvoidKeyboard()183 bool AvoidKeyboard() const override 184 { 185 // If UIExtensionComponent uses ModalPage, ModalPage will avoid KeyBoard. 186 return isUIExtension_; 187 } 188 UpdateUIExtensionMode(bool isUIExtension)189 void UpdateUIExtensionMode(bool isUIExtension) 190 { 191 isUIExtension_ = isUIExtension; 192 } 193 AvoidBottom()194 bool AvoidBottom() const override 195 { 196 // If UIExtensionComponent uses ModalPage, ModalPage will not avoid bottom. 197 return !isUIExtension_; 198 } 199 TriggerAutoSaveWhenInvisible()200 bool TriggerAutoSaveWhenInvisible() override 201 { 202 return true; 203 } 204 205 private: 206 void OnAttachToFrameNode() override; 207 bool isUIExtension_ = false; 208 bool prohibitedRemoveByRouter_ = false; 209 bool prohibitedRemoveByNavigation_ = true; 210 int32_t targetId_ = -1; 211 ModalTransition type_ = ModalTransition::DEFAULT; 212 bool hasTransitionEffect_ = false; 213 std::function<void(const int32_t& info)> onWillDismiss_; 214 std::function<void(const std::string&)> callback_; 215 std::function<void()> onDisappear_; 216 std::function<void()> onWillDisappear_; 217 std::function<void()> onAppear_; 218 bool isExecuteOnDisappear_ = false; 219 220 ACE_DISALLOW_COPY_AND_MOVE(ModalPresentationPattern); 221 }; 222 } // namespace OHOS::Ace::NG 223 224 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_OVERLAY_MODAL_PRESENTATION_PATTERN_H 225