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