1 /*
2 * Copyright (c) 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 #define LOG_TAG "SysEventSubscriber"
16 #include "sys_event_subscriber.h"
17
18 #include "common_event_manager.h"
19 #include "common_event_support.h"
20 #include "log_print.h"
21 #include "proxy_data_manager.h"
22
23 namespace OHOS::DataShare {
SysEventSubscriber(const EventFwk::CommonEventSubscribeInfo & info,std::shared_ptr<ExecutorPool> executors)24 SysEventSubscriber::SysEventSubscriber(const EventFwk::CommonEventSubscribeInfo& info,
25 std::shared_ptr<ExecutorPool> executors): CommonEventSubscriber(info), executors_(executors)
26 {
27 callbacks_ = {
28 { EventFwk::CommonEventSupport::COMMON_EVENT_BUNDLE_SCAN_FINISHED,
29 &SysEventSubscriber::OnBMSReady }
30 };
31 installCallbacks_ = {
32 { EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_ADDED,
33 &SysEventSubscriber::OnAppInstall },
34 { EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_CHANGED,
35 &SysEventSubscriber::OnAppUpdate },
36 { EventFwk::CommonEventSupport::COMMON_EVENT_PACKAGE_REMOVED,
37 &SysEventSubscriber::OnAppUninstall }
38 };
39 }
40
OnReceiveEvent(const EventFwk::CommonEventData & event)41 void SysEventSubscriber::OnReceiveEvent(const EventFwk::CommonEventData& event)
42 {
43 EventFwk::Want want = event.GetWant();
44 std::string action = want.GetAction();
45 auto installEvent = installCallbacks_.find(action);
46 if (installEvent != installCallbacks_.end()) {
47 std::string bundleName = want.GetElement().GetBundleName();
48 int32_t userId = want.GetIntParam(USER_ID, -1);
49 int32_t appIndex = want.GetIntParam(APP_INDEX, 0);
50 uint32_t tokenId = static_cast<uint32_t>(want.GetIntParam(ACCESS_TOKEN_ID, 0));
51 // when application updated, the tokenId in event's want is 0, so use other way to get tokenId
52 if (tokenId == 0) {
53 tokenId = Security::AccessToken::AccessTokenKit::GetHapTokenID(userId, bundleName, appIndex);
54 }
55 bool isCrossAppSharedConfig = want.GetBoolParam(CROSS_APP_SHARED_CONFIG, false);
56 ZLOGI("bundleName:%{public}s, user:%{public}d, appIndex:%{public}d, tokenId:%{public}d, "
57 "isCrossAppSharedConfig:%{public}d", bundleName.c_str(), userId, appIndex, tokenId, isCrossAppSharedConfig);
58 (this->*(installEvent->second))(bundleName, userId, appIndex, tokenId, isCrossAppSharedConfig);
59 }
60
61 auto it = callbacks_.find(action);
62 if (it != callbacks_.end()) {
63 (this->*(it->second))();
64 }
65 }
66
OnBMSReady()67 void SysEventSubscriber::OnBMSReady()
68 {
69 NotifyDataShareReady();
70 auto executors = executors_;
71 if (executors == nullptr) {
72 ZLOGE("executors is null.");
73 return;
74 }
75 executors->Execute([]() {
76 DataShareServiceImpl::UpdateLaunchInfo();
77 });
78 }
79
OnAppInstall(const std::string & bundleName,int32_t userId,int32_t appIndex,uint32_t tokenId,bool isCrossAppSharedConfig)80 void SysEventSubscriber::OnAppInstall(const std::string &bundleName,
81 int32_t userId, int32_t appIndex, uint32_t tokenId, bool isCrossAppSharedConfig)
82 {
83 ZLOGI("%{public}s installed, userId: %{public}d, appIndex: %{public}d, tokenId: %{public}d",
84 bundleName.c_str(), userId, appIndex, tokenId);
85 if (isCrossAppSharedConfig) {
86 ProxyDataManager::GetInstance().OnAppInstall(bundleName, userId, appIndex, tokenId);
87 }
88 }
89
OnAppUpdate(const std::string & bundleName,int32_t userId,int32_t appIndex,uint32_t tokenId,bool isCrossAppSharedConfig)90 void SysEventSubscriber::OnAppUpdate(const std::string &bundleName,
91 int32_t userId, int32_t appIndex, uint32_t tokenId, bool isCrossAppSharedConfig)
92 {
93 ZLOGI("%{public}s updated, userId: %{public}d, appIndex: %{public}d, tokenId: %{public}d",
94 bundleName.c_str(), userId, appIndex, tokenId);
95 if (isCrossAppSharedConfig) {
96 ProxyDataManager::GetInstance().OnAppUpdate(bundleName, userId, appIndex, tokenId);
97 }
98 }
99
OnAppUninstall(const std::string & bundleName,int32_t userId,int32_t appIndex,uint32_t tokenId,bool isCrossAppSharedConfig)100 void SysEventSubscriber::OnAppUninstall(const std::string &bundleName,
101 int32_t userId, int32_t appIndex, uint32_t tokenId, bool isCrossAppSharedConfig)
102 {
103 ZLOGI("%{public}s uninstalled, userId: %{public}d, appIndex: %{public}d, tokenId: %{public}d",
104 bundleName.c_str(), userId, appIndex, tokenId);
105 ProxyDataManager::GetInstance().OnAppUninstall(bundleName, userId, appIndex, tokenId);
106 }
107
NotifyDataShareReady()108 void SysEventSubscriber::NotifyDataShareReady()
109 {
110 AAFwk::Want want;
111 want.SetAction("usual.event.DATA_SHARE_READY");
112 EventFwk::CommonEventData CommonEventData { want };
113 EventFwk::CommonEventPublishInfo publishInfo;
114 publishInfo.SetSticky(true);
115 if (!EventFwk::CommonEventManager::PublishCommonEvent(CommonEventData, publishInfo)) {
116 ZLOGE("Notify dataShare ready failed.");
117 return;
118 }
119 ZLOGI("Notify dataShare ready succeed.");
120 }
121 }