1 /*
2  * Copyright (C) 2022 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 #include "call_connect_ability.h"
17 
18 #include "ability_manager_client.h"
19 #include "call_ability_connect_callback.h"
20 #include "call_number_utils.h"
21 #include "int_wrapper.h"
22 #include "string_wrapper.h"
23 #include "telephony_log_wrapper.h"
24 #include "want.h"
25 
26 namespace OHOS {
27 namespace Telephony {
28 std::condition_variable CallConnectAbility::cv_;
29 
~CallConnectAbility()30 CallConnectAbility::~CallConnectAbility() {}
31 
CallConnectAbility()32 CallConnectAbility::CallConnectAbility() {}
33 
ConnectAbility()34 void CallConnectAbility::ConnectAbility()
35 {
36     SetConnectingFlag(true);
37     if (isDisconnecting_) {
38         TELEPHONY_LOGE("callui is disconnecting");
39         return;
40     }
41     if (isConnected_) {
42         TELEPHONY_LOGE("callui has already connected");
43         SetConnectingFlag(false);
44         return;
45     }
46     TELEPHONY_LOGI("Connect callui ability");
47     AAFwk::Want want;
48     AppExecFwk::ElementName element("", "com.ohos.callui", "com.ohos.callui.ServiceAbility");
49     want.SetElement(element);
50     if (connectCallback_ == nullptr) {
51         connectCallback_ = new CallAbilityConnectCallback();
52     }
53     int32_t userId = -1;
54     std::string identity = IPCSkeleton::ResetCallingIdentity();
55     AAFwk::AbilityManagerClient::GetInstance()->ConnectAbility(want, connectCallback_, userId);
56     IPCSkeleton::SetCallingIdentity(identity);
57 }
58 
DisconnectAbility()59 void CallConnectAbility::DisconnectAbility()
60 {
61     SetDisconnectingFlag(true);
62     if (isConnecting_) {
63         TELEPHONY_LOGE("callui is connecting");
64         return;
65     }
66     if (!WaitForConnectResult()) {
67         SetDisconnectingFlag(false);
68         return;
69     }
70     if (connectCallback_ != nullptr) {
71         TELEPHONY_LOGI("Disconnect callui ability");
72         std::string identity = IPCSkeleton::ResetCallingIdentity();
73         AAFwk::AbilityManagerClient::GetInstance()->DisconnectAbility(connectCallback_);
74         IPCSkeleton::SetCallingIdentity(identity);
75         connectCallback_ = nullptr;
76     }
77 }
78 
SetConnectFlag(bool isConnected)79 void CallConnectAbility::SetConnectFlag(bool isConnected)
80 {
81     isConnected_ = isConnected;
82 }
83 
GetConnectFlag()84 bool CallConnectAbility::GetConnectFlag()
85 {
86     return isConnected_;
87 }
88 
SetDisconnectingFlag(bool isDisconnecting)89 void CallConnectAbility::SetDisconnectingFlag(bool isDisconnecting)
90 {
91     isDisconnecting_ = isDisconnecting;
92     if (!isDisconnecting_ && isConnecting_) {
93         ConnectAbility();
94         TELEPHONY_LOGE("reconnect ability");
95     }
96 }
97 
SetConnectingFlag(bool isConnecting)98 void CallConnectAbility::SetConnectingFlag(bool isConnecting)
99 {
100     isConnecting_ = isConnecting;
101     if (!isConnecting_ && isDisconnecting_) {
102         DisconnectAbility();
103         TELEPHONY_LOGE("redisconnect ability");
104     }
105 }
106 
NotifyAll()107 void CallConnectAbility::NotifyAll()
108 {
109     cv_.notify_all();
110 }
111 
WaitForConnectResult()112 bool CallConnectAbility::WaitForConnectResult()
113 {
114     if (!isConnected_) {
115         std::unique_lock<std::mutex> lock(mutex_);
116         while (!isConnected_) {
117             if (cv_.wait_for(lock, std::chrono::seconds(WAIT_TIME_ONE_SECOND)) == std::cv_status::timeout) {
118                 TELEPHONY_LOGE("callui is not connected, no need to disconnect ability");
119                 return false;
120             }
121         }
122     }
123     return true;
124 }
125 } // namespace Telephony
126 } // namespace OHOS
127