• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021 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 "ability_context_ability.h"
17 #include "app_log_wrapper.h"
18 #include "base_ability.h"
19 #include "test_utils.h"
20 
21 namespace OHOS {
22 namespace AppExecFwk {
23 using namespace OHOS::EventFwk;
24 namespace {
25 constexpr int SLEEP_SECOND = 2;
26 }
27 
~AbilityContextAbility()28 AbilityContextAbility::~AbilityContextAbility()
29 {
30     CommonEventManager::UnSubscribeCommonEvent(subscriber_);
31 }
32 
Init(const std::shared_ptr<AbilityInfo> & abilityInfo,const std::shared_ptr<OHOSApplication> & application,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)33 void AbilityContextAbility::Init(const std::shared_ptr<AbilityInfo> &abilityInfo,
34     const std::shared_ptr<OHOSApplication> &application, std::shared_ptr<AbilityHandler> &handler,
35     const sptr<IRemoteObject> &token)
36 {
37     APP_LOGI("AbilityContextAbility::Init called.");
38     BaseAbility::Init(abilityInfo, application, handler, token);
39 
40     SubscribeEvent();
41 }
42 
SubscribeEvent()43 bool AbilityContextAbility::SubscribeEvent()
44 {
45     MatchingSkills matchingSkills;
46     matchingSkills.AddEvent(APP_ABILITY_CONTEXT_REQ_EVENT_NAME);
47     CommonEventSubscribeInfo subscribeInfo(matchingSkills);
48     subscribeInfo.SetPriority(1);
49     subscriber_ = std::make_shared<AbilityContextAbilityEventSubscriber>(subscribeInfo);
50     subscriber_->mainAbility = *this;
51     return CommonEventManager::SubscribeCommonEvent(subscriber_);
52 }
53 
OnStart(const Want & want)54 void AbilityContextAbility::OnStart(const Want &want)
55 {
56     want_ = want;
57     sequenceNumber_ = std::stoi(GetNoFromWantInfo(want));
58     APP_LOGI("AbilityContextAbility::OnStart");
59 
60     BaseAbility::OnStart(want);
61     TestUtils::PublishEvent(
62         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnStart");
63 }
64 
OnStop()65 void AbilityContextAbility::OnStop()
66 {
67     APP_LOGI("AbilityContextAbility::OnStop");
68     BaseAbility::OnStop();
69     TestUtils::PublishEvent(
70         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INITIAL, "OnStop");
71 }
72 
OnActive()73 void AbilityContextAbility::OnActive()
74 {
75     APP_LOGI("AbilityContextAbility::OnActive");
76     BaseAbility::OnActive();
77     TestUtils::PublishEvent(
78         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnActive");
79 }
80 
OnInactive()81 void AbilityContextAbility::OnInactive()
82 {
83     APP_LOGI("AbilityContextAbility::OnInactive");
84     BaseAbility::OnInactive();
85     TestUtils::PublishEvent(
86         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnInactive");
87 }
88 
OnBackground()89 void AbilityContextAbility::OnBackground()
90 {
91     APP_LOGI("AbilityContextAbility::OnBackground");
92     BaseAbility::OnBackground();
93     TestUtils::PublishEvent(
94         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnBackground");
95 }
96 
OnForeground(const Want & want)97 void AbilityContextAbility::OnForeground(const Want &want)
98 {
99     APP_LOGI("AbilityContextAbility::OnForeground");
100     BaseAbility::OnBackground();
101     TestUtils::PublishEvent(
102         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::INACTIVE, "OnForeground");
103 }
104 
OnCommand(const Want & want,bool restart,int startId)105 void AbilityContextAbility::OnCommand(const Want &want, bool restart, int startId)
106 {
107     APP_LOGI("AbilityContextAbility::OnCommand");
108 
109     BaseAbility::OnCommand(want, restart, startId);
110     TestUtils::PublishEvent(
111         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnCommand");
112 }
113 
OnConnect(const Want & want)114 sptr<IRemoteObject> AbilityContextAbility::OnConnect(const Want &want)
115 {
116     APP_LOGI("AbilityContextAbility::OnConnect");
117 
118     sptr<IRemoteObject> ret = BaseAbility::OnConnect(want);
119     TestUtils::PublishEvent(
120         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::ACTIVE, "OnConnect");
121     return ret;
122 }
123 
OnDisconnect(const Want & want)124 void AbilityContextAbility::OnDisconnect(const Want &want)
125 {
126     APP_LOGI("AbilityContextAbility::OnDisconnect");
127 
128     BaseAbility::OnDisconnect(want);
129     TestUtils::PublishEvent(
130         APP_ABILITY_CONTEXT_RESP_EVENT_NAME, AbilityLifecycleExecutor::LifecycleState::BACKGROUND, "OnDisconnect");
131 }
132 
ConnectCaseIndexOne()133 void AbilityContextAbility::ConnectCaseIndexOne() {
134     stub_ = new (std::nothrow) AbilityContextConnectCallback();
135     connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
136     bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
137     TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
138     sleep(SLEEP_SECOND);
139     BaseAbility::GetContext()->DisconnectAbility(connCallback_);
140 }
141 
ConnectCaseIndexTwo()142 void AbilityContextAbility::ConnectCaseIndexTwo() {
143     stub_ = new (std::nothrow) AbilityContextConnectCallback();
144     connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
145     MAP_STR_STR params;
146     Want want =
147         TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
148     bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
149     TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
150     sleep(1);
151     BaseAbility::GetContext()->DisconnectAbility(connCallback_);
152 }
153 
TestConnectAbility()154 void AbilityContextAbility::TestConnectAbility()
155 {
156     switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
157         case CaseIndex::ONE: {
158             ConnectCaseIndexOne();
159         } break;
160         case CaseIndex::TWO: {
161             ConnectCaseIndexTwo();
162         } break;
163         case CaseIndex::THREE: {
164             stub_ = new (std::nothrow) AbilityContextConnectCallback();
165             connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
166             MAP_STR_STR params;
167             Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
168             bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
169             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
170             sleep(1);
171             BaseAbility::GetContext()->DisconnectAbility(connCallback_);
172         } break;
173         case CaseIndex::FOUR: {
174             for (int i = 0; i < (int)CaseIndex::THREE; i++) {
175                 stub_ = new (std::nothrow) AbilityContextConnectCallback();
176                 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
177                 bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
178                 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
179                 sleep(1);
180                 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
181             }
182         } break;
183         case CaseIndex::FIVE: {
184             sptr<AbilityContextConnectCallback> stub(new (std::nothrow) AbilityContextConnectCallback());
185             sptr<AbilityConnectionProxy> connCallback(new (std::nothrow) AbilityConnectionProxy(stub));
186             bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback);
187             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestConnectAbility");
188             sleep(1);
189             BaseAbility::GetContext()->DisconnectAbility(connCallback_);
190         } break;
191         default:
192             break;
193     }
194 }
195 
TestStopAbility()196 void AbilityContextAbility::TestStopAbility()
197 {
198     switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
199         case CaseIndex::ONE: {
200             bool ret = BaseAbility::GetContext()->StopAbility(want_);
201             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
202         } break;
203         case CaseIndex::TWO: {
204             MAP_STR_STR params;
205             Want want =
206                 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
207             bool ret = BaseAbility::GetContext()->StopAbility(want);
208             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
209         } break;
210         case CaseIndex::THREE: {
211             MAP_STR_STR params;
212             Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
213             bool ret = BaseAbility::GetContext()->StopAbility(want);
214             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
215         } break;
216         case CaseIndex::FOUR: {
217             for (int i = 0; i < (int)CaseIndex::THREE; i++) {
218                 bool ret = BaseAbility::GetContext()->StopAbility(want_);
219                 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
220             }
221         } break;
222         case CaseIndex::FIVE: {
223             MAP_STR_STR params;
224             Want want =
225                 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
226             bool ret = BaseAbility::GetContext()->StopAbility(want);
227             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestStopAbility");
228         } break;
229         default:
230             break;
231     }
232 }
233 
DisconnectCaseIndexOne()234 void AbilityContextAbility::DisconnectCaseIndexOne() {
235     stub_ = new (std::nothrow) AbilityContextConnectCallback();
236     connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
237     bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
238     TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
239     BaseAbility::GetContext()->DisconnectAbility(connCallback_);
240 }
241 
DisconnectCaseIndexTwo()242 void AbilityContextAbility::DisconnectCaseIndexTwo() {
243     MAP_STR_STR params;
244     Want want =
245         TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
246     stub_ = new (std::nothrow) AbilityContextConnectCallback();
247     connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
248     bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
249     TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
250     sleep(SLEEP_SECOND);
251     BaseAbility::GetContext()->DisconnectAbility(connCallback_);
252 }
253 
TestDisconnectAbility()254 void AbilityContextAbility::TestDisconnectAbility()
255 {
256     switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
257         case CaseIndex::ONE: {
258             DisconnectCaseIndexOne();
259         } break;
260         case CaseIndex::TWO: {
261             DisconnectCaseIndexTwo();
262         } break;
263         case CaseIndex::THREE: {
264             MAP_STR_STR params;
265             Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
266             stub_ = new (std::nothrow) AbilityContextConnectCallback();
267             connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
268             bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
269             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
270             sleep(SLEEP_SECOND);
271             BaseAbility::GetContext()->DisconnectAbility(connCallback_);
272         } break;
273         case CaseIndex::FOUR: {
274             for (int i = 0; i < (int)CaseIndex::THREE; i++) {
275                 stub_ = new (std::nothrow) AbilityContextConnectCallback();
276                 connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
277                 bool ret = BaseAbility::GetContext()->ConnectAbility(want_, connCallback_);
278                 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
279                 BaseAbility::GetContext()->DisconnectAbility(connCallback_);
280             }
281         } break;
282         case CaseIndex::FIVE: {
283             MAP_STR_STR params;
284             Want want =
285                 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
286             stub_ = new (std::nothrow) AbilityContextConnectCallback();
287             connCallback_ = new (std::nothrow) AbilityConnectionProxy(stub_);
288             bool ret = BaseAbility::GetContext()->ConnectAbility(want, connCallback_);
289             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, ret, "TestDisconnectAbility");
290             BaseAbility::GetContext()->DisconnectAbility(connCallback_);
291         } break;
292         default:
293             break;
294     }
295 }
296 
TestStartAbility()297 void AbilityContextAbility::TestStartAbility()
298 {
299     switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
300         case CaseIndex::ONE: {
301             BaseAbility::GetContext()->StartAbility(want_, 0);
302             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
303         } break;
304         case CaseIndex::TWO: {
305             MAP_STR_STR params;
306             Want want =
307                 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
308             BaseAbility::GetContext()->StartAbility(want, 0);
309             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
310             sleep(SLEEP_SECOND);
311             BaseAbility::GetContext()->StopAbility(want);
312         } break;
313         case CaseIndex::THREE: {
314             MAP_STR_STR params;
315             Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
316             BaseAbility::GetContext()->StartAbility(want, 0);
317             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
318             sleep(SLEEP_SECOND);
319             BaseAbility::GetContext()->StopAbility(want);
320         } break;
321         case CaseIndex::FOUR: {
322             for (int i = 0; i < (int)CaseIndex::THREE; i++) {
323                 BaseAbility::GetContext()->StartAbility(want_, 0);
324                 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
325             }
326         } break;
327         case CaseIndex::FIVE: {
328             MAP_STR_STR params;
329             Want want =
330                 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
331             BaseAbility::GetContext()->StartAbility(want, 0);
332             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestStartAbility");
333         } break;
334         default:
335             break;
336     }
337 }
338 
TestTerminateAbility()339 void AbilityContextAbility::TestTerminateAbility()
340 {
341     switch ((CaseIndex)AbilityContextAbility::sequenceNumber_) {
342         case CaseIndex::ONE: {
343             BaseAbility::GetContext()->TerminateAbility();
344             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
345         } break;
346         case CaseIndex::TWO: {
347             MAP_STR_STR params;
348             Want want =
349                 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKit", params);
350             BaseAbility::GetContext()->StartAbility(want, 0);
351             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
352             sleep(SLEEP_SECOND);
353             BaseAbility::GetContext()->StopAbility(want);
354             BaseAbility::GetContext()->TerminateAbility();
355         } break;
356         case CaseIndex::THREE: {
357             MAP_STR_STR params;
358             Want want = TestUtils::MakeWant("", "AmsStServiceAbilityA1", "com.ohos.amsst.service.appA", params);
359             BaseAbility::GetContext()->StartAbility(want, 0);
360             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
361             sleep(SLEEP_SECOND);
362             BaseAbility::GetContext()->StopAbility(want);
363             BaseAbility::GetContext()->TerminateAbility();
364         } break;
365         case CaseIndex::FOUR: {
366             for (int i = 0; i < (int)CaseIndex::THREE; i++) {
367                 BaseAbility::GetContext()->TerminateAbility();
368                 TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
369             }
370         } break;
371         case CaseIndex::FIVE: {
372             MAP_STR_STR params;
373             Want want =
374                 TestUtils::MakeWant("", "LifecycleCallbacksAbility", "com.ohos.amsst.service.AppKitx", params);
375             BaseAbility::GetContext()->StartAbility(want, 0);
376             BaseAbility::GetContext()->TerminateAbility();
377             TestUtils::PublishEvent(APP_ABILITY_CONTEXT_RESP_EVENT_NAME, 1, "TestTerminateAbility");
378         } break;
379         default:
380             break;
381     }
382 }
383 
OnReceiveEvent(const CommonEventData & data)384 void AbilityContextAbilityEventSubscriber::OnReceiveEvent(const CommonEventData &data)
385 {
386     APP_LOGI(
387         "AbilityContextAbilityEventSubscriber::OnReceiveEvent:event=%{public}s", data.GetWant().GetAction().c_str());
388     APP_LOGI("AbilityContextAbilityEventSubscriber::OnReceiveEvent:data=%{public}s", data.GetData().c_str());
389     APP_LOGI("AbilityContextAbilityEventSubscriber::OnReceiveEvent:code=%{public}d", data.GetCode());
390 
391     auto eventName = data.GetWant().GetAction();
392     if (std::strcmp(eventName.c_str(), APP_ABILITY_CONTEXT_REQ_EVENT_NAME.c_str()) == 0) {
393         auto target = data.GetData();
394         auto func = mapTestFunc_.find(target);
395         if (func != mapTestFunc_.end()) {
396             func->second();
397         } else {
398             APP_LOGI("AbilityContextAbilityEventSubscriber::OnReceiveEvent: CommonEventData error(%{public}s)",
399                 target.c_str());
400         }
401     }
402 }
403 REGISTER_AA(AbilityContextAbility)
404 }  // namespace AppExecFwk
405 }  // namespace OHOS