1 /* 2 * Copyright (C) 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 INCALL_DATA_STATE_MACHINE_H 17 #define INCALL_DATA_STATE_MACHINE_H 18 19 #include <map> 20 #include <memory> 21 22 #include "apn_manager.h" 23 #include "cellular_data_constant.h" 24 #include "inner_event.h" 25 #include "refbase.h" 26 #include "state_machine.h" 27 #include "tel_event_handler.h" 28 29 namespace OHOS { 30 namespace Telephony { 31 class IncallDataStateMachine : public StateMachine, public std::enable_shared_from_this<IncallDataStateMachine> { 32 public: IncallDataStateMachine(int32_t slotId,std::weak_ptr<TelEventHandler> && cellularDataHandler,sptr<ApnManager> & apnManager)33 IncallDataStateMachine( 34 int32_t slotId, std::weak_ptr<TelEventHandler> &&cellularDataHandler, sptr<ApnManager> &apnManager) 35 : StateMachine("IncallDataStateMachine"), cellularDataHandler_(std::move(cellularDataHandler)), 36 apnManager_(apnManager), slotId_(slotId) 37 {} 38 ~IncallDataStateMachine() = default; 39 sptr<State> GetCurrentState() const; 40 int32_t GetSlotId() const; 41 int32_t GetCallState() const; 42 bool HasAnyConnectedState() const; 43 void UpdateCallState(int32_t state); 44 void Init(int32_t callState); 45 46 protected: 47 sptr<State> idleState_; 48 sptr<State> secondaryActiveState_; 49 sptr<State> activatingSecondaryState_; 50 sptr<State> activatedSecondaryState_; 51 sptr<State> deactivatingSecondaryState_; 52 sptr<State> currentState_; 53 std::weak_ptr<TelEventHandler> cellularDataHandler_; 54 sptr<ApnManager> apnManager_; 55 56 private: 57 void SetCurrentState(const sptr<State> &&state); 58 bool IsIncallDataSwitchOn(); 59 bool IsSecondaryCanActiveData(); 60 bool CanActiveDataByRadioTech(); 61 62 private: 63 friend class IdleState; 64 friend class SecondaryActiveState; 65 friend class ActivatingSecondaryState; 66 friend class ActivatedSecondaryState; 67 friend class DeactivatingSecondaryState; 68 int32_t slotId_ = INVALID_SLOT_ID; 69 int32_t callState_ = static_cast<int32_t>(TelCallStatus::CALL_STATUS_IDLE); 70 }; 71 72 class IdleState : public State { 73 public: IdleState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)74 IdleState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name) 75 : State(std::move(name)), stateMachine_(std::move(incallData)) 76 {} 77 virtual ~IdleState() = default; 78 virtual void StateBegin(); 79 virtual void StateEnd(); 80 virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event); 81 82 private: 83 bool ProcessCallStarted(const AppExecFwk::InnerEvent::Pointer &event); 84 bool ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer &event); 85 bool ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer &event); 86 bool ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer &event); 87 88 private: 89 using Fun = std::function<bool(const AppExecFwk::InnerEvent::Pointer &data)>; 90 std::map<uint32_t, Fun> eventIdFunMap_ { 91 { CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_STARTED, 92 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessCallStarted(data); } }, 93 { CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_ENDED, 94 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessCallEnded(data); } }, 95 { CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON, 96 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessSettingsOn(data); } }, 97 { CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED, 98 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessDsdsChanged(data); } }, 99 }; 100 std::weak_ptr<IncallDataStateMachine> stateMachine_; 101 }; 102 103 class SecondaryActiveState : public State { 104 public: SecondaryActiveState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)105 SecondaryActiveState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name) 106 : State(std::move(name)), stateMachine_(std::move(incallData)) 107 {} 108 virtual ~SecondaryActiveState() = default; 109 virtual void StateBegin(); 110 virtual void StateEnd(); 111 virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event); 112 113 private: 114 bool ProcessSettingsOn(const AppExecFwk::InnerEvent::Pointer &event); 115 bool ProcessCallEnded(const AppExecFwk::InnerEvent::Pointer &event); 116 bool ProcessSettingsOff(const AppExecFwk::InnerEvent::Pointer &event); 117 bool ProcessDsdsChanged(const AppExecFwk::InnerEvent::Pointer &event); 118 119 private: 120 using Fun = std::function<bool(const AppExecFwk::InnerEvent::Pointer &data)>; 121 std::map<uint32_t, Fun> eventIdFunMap_ { 122 { CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_ON, 123 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessSettingsOn(data); } }, 124 { CellularDataEventCode::MSG_SM_INCALL_DATA_CALL_ENDED, 125 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessCallEnded(data); } }, 126 { CellularDataEventCode::MSG_SM_INCALL_DATA_SETTINGS_OFF, 127 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessSettingsOff(data); } }, 128 { CellularDataEventCode::MSG_SM_INCALL_DATA_DSDS_CHANGED, 129 [this](const AppExecFwk::InnerEvent::Pointer &data) { return ProcessDsdsChanged(data); } }, 130 }; 131 std::weak_ptr<IncallDataStateMachine> stateMachine_; 132 }; 133 134 class ActivatingSecondaryState : public State { 135 public: ActivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)136 ActivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name) 137 : State(std::move(name)), stateMachine_(std::move(incallData)) 138 {} 139 virtual ~ActivatingSecondaryState() = default; 140 virtual void StateBegin(); 141 virtual void StateEnd(); 142 virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event); 143 144 private: 145 std::weak_ptr<IncallDataStateMachine> stateMachine_; 146 }; 147 148 class ActivatedSecondaryState : public State { 149 public: ActivatedSecondaryState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)150 ActivatedSecondaryState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name) 151 : State(std::move(name)), stateMachine_(std::move(incallData)) 152 {} 153 virtual ~ActivatedSecondaryState() = default; 154 virtual void StateBegin(); 155 virtual void StateEnd(); 156 virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event); 157 158 private: 159 std::weak_ptr<IncallDataStateMachine> stateMachine_; 160 }; 161 162 class DeactivatingSecondaryState : public State { 163 public: DeactivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> && incallData,std::string && name)164 DeactivatingSecondaryState(std::weak_ptr<IncallDataStateMachine> &&incallData, std::string &&name) 165 : State(std::move(name)), stateMachine_(std::move(incallData)) 166 {} 167 virtual ~DeactivatingSecondaryState() = default; 168 virtual void StateBegin(); 169 virtual void StateEnd(); 170 virtual bool StateProcess(const AppExecFwk::InnerEvent::Pointer &event); 171 172 private: 173 std::weak_ptr<IncallDataStateMachine> stateMachine_; 174 }; 175 } // namespace Telephony 176 } // namespace OHOS 177 #endif // INCALL_DATA_STATE_MACHINE_H