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 OHOS_AAFwk_UI_EXTENSION_UTILS_H
17#define OHOS_AAFwk_UI_EXTENSION_UTILS_H
18
19#include <unordered_set>
20
21#include "extension_ability_info.h"
22#include "ipc_skeleton.h"
23
24namespace OHOS {
25namespace AAFwk {
26namespace {
27constexpr int EDM_SA_UID = 3057;
28}
29namespace UIExtensionUtils {
30// ui extension type list
31inline std::unordered_set<AppExecFwk::ExtensionAbilityType> GetUiExtensionSet()
32{
33    return std::unordered_set<AppExecFwk::ExtensionAbilityType> {
34        AppExecFwk::ExtensionAbilityType::SHARE,
35        AppExecFwk::ExtensionAbilityType::ACTION,
36        AppExecFwk::ExtensionAbilityType::EMBEDDED_UI,
37        AppExecFwk::ExtensionAbilityType::INSIGHT_INTENT_UI,
38        AppExecFwk::ExtensionAbilityType::AUTO_FILL_PASSWORD,
39        AppExecFwk::ExtensionAbilityType::UI,
40        AppExecFwk::ExtensionAbilityType::SYSPICKER_MEDIACONTROL,
41        AppExecFwk::ExtensionAbilityType::SYSDIALOG_USERAUTH,
42        AppExecFwk::ExtensionAbilityType::SYSDIALOG_COMMON,
43        AppExecFwk::ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL,
44        AppExecFwk::ExtensionAbilityType::SYSDIALOG_POWER,
45        AppExecFwk::ExtensionAbilityType::SYSPICKER_SHARE,
46        AppExecFwk::ExtensionAbilityType::HMS_ACCOUNT,
47        AppExecFwk::ExtensionAbilityType::ADS,
48        AppExecFwk::ExtensionAbilityType::VOIP,
49        AppExecFwk::ExtensionAbilityType::STATUS_BAR_VIEW,
50        AppExecFwk::ExtensionAbilityType::SYSDIALOG_MEETIMECALL,
51        AppExecFwk::ExtensionAbilityType::SYSDIALOG_MEETIMECONTACT,
52        AppExecFwk::ExtensionAbilityType::SYSDIALOG_MEETIMEMESSAGE,
53        AppExecFwk::ExtensionAbilityType::SYSDIALOG_PRINT,
54        AppExecFwk::ExtensionAbilityType::SYSPICKER_MEETIMECONTACT,
55        AppExecFwk::ExtensionAbilityType::SYSPICKER_MEETIMECALLLOG,
56        AppExecFwk::ExtensionAbilityType::SYSPICKER_PHOTOPICKER,
57        AppExecFwk::ExtensionAbilityType::SYS_COMMON_UI,
58        AppExecFwk::ExtensionAbilityType::SYSPICKER_NAVIGATION,
59        AppExecFwk::ExtensionAbilityType::SYSPICKER_APPSELECTOR,
60        AppExecFwk::ExtensionAbilityType::SYSPICKER_CAMERA,
61        AppExecFwk::ExtensionAbilityType::SYSPICKER_FILEPICKER,
62        AppExecFwk::ExtensionAbilityType::AUTO_FILL_SMART,
63        AppExecFwk::ExtensionAbilityType::LIVEVIEW_LOCKSCREEN,
64        AppExecFwk::ExtensionAbilityType::SYSPICKER_PHOTOEDITOR,
65        AppExecFwk::ExtensionAbilityType::PHOTO_EDITOR,
66        AppExecFwk::ExtensionAbilityType::SYSPICKER_AUDIOPICKER,
67        AppExecFwk::ExtensionAbilityType::SYS_VISUAL,
68        AppExecFwk::ExtensionAbilityType::RECENT_PHOTO
69    };
70}
71
72inline bool IsUIExtension(const AppExecFwk::ExtensionAbilityType type)
73{
74    return GetUiExtensionSet().count(type) > 0;
75}
76
77inline bool IsSystemUIExtension(const AppExecFwk::ExtensionAbilityType type)
78{
79    const std::unordered_set<AppExecFwk::ExtensionAbilityType> systemUiExtensionSet = {
80        AppExecFwk::ExtensionAbilityType::SYSDIALOG_COMMON,
81        AppExecFwk::ExtensionAbilityType::SYSDIALOG_ATOMICSERVICEPANEL,
82        AppExecFwk::ExtensionAbilityType::SYSDIALOG_POWER,
83        AppExecFwk::ExtensionAbilityType::SYSDIALOG_MEETIMECALL,
84        AppExecFwk::ExtensionAbilityType::SYSDIALOG_MEETIMECONTACT,
85        AppExecFwk::ExtensionAbilityType::SYSDIALOG_MEETIMEMESSAGE,
86        AppExecFwk::ExtensionAbilityType::SYSDIALOG_PRINT,
87        AppExecFwk::ExtensionAbilityType::SYSPICKER_MEDIACONTROL,
88        AppExecFwk::ExtensionAbilityType::SYSPICKER_SHARE,
89        AppExecFwk::ExtensionAbilityType::SYSPICKER_MEETIMECONTACT,
90        AppExecFwk::ExtensionAbilityType::SYSPICKER_MEETIMECALLLOG,
91        AppExecFwk::ExtensionAbilityType::SYSPICKER_PHOTOPICKER,
92        AppExecFwk::ExtensionAbilityType::SYSPICKER_NAVIGATION,
93        AppExecFwk::ExtensionAbilityType::SYSPICKER_APPSELECTOR,
94        AppExecFwk::ExtensionAbilityType::UI,
95        AppExecFwk::ExtensionAbilityType::SYS_COMMON_UI,
96        AppExecFwk::ExtensionAbilityType::SYSPICKER_PHOTOEDITOR,
97        AppExecFwk::ExtensionAbilityType::ADS,
98        AppExecFwk::ExtensionAbilityType::SYSPICKER_AUDIOPICKER,
99        AppExecFwk::ExtensionAbilityType::AUTO_FILL_PASSWORD,
100        AppExecFwk::ExtensionAbilityType::SYSPICKER_CAMERA,
101        AppExecFwk::ExtensionAbilityType::AUTO_FILL_SMART,
102        AppExecFwk::ExtensionAbilityType::SYSPICKER_FILEPICKER,
103        AppExecFwk::ExtensionAbilityType::SYSDIALOG_USERAUTH,
104        AppExecFwk::ExtensionAbilityType::HMS_ACCOUNT,
105        AppExecFwk::ExtensionAbilityType::SYS_VISUAL,
106        AppExecFwk::ExtensionAbilityType::RECENT_PHOTO
107    };
108    return systemUiExtensionSet.find(type) != systemUiExtensionSet.end();
109}
110
111// In this case, extension which be starting needs that caller should be the system app, otherwise not supported.
112inline bool IsSystemCallerNeeded(const AppExecFwk::ExtensionAbilityType type)
113{
114    const std::unordered_set<AppExecFwk::ExtensionAbilityType> uiExtensionStartingSet = {
115        AppExecFwk::ExtensionAbilityType::PHOTO_EDITOR,
116        AppExecFwk::ExtensionAbilityType::INSIGHT_INTENT_UI,
117        AppExecFwk::ExtensionAbilityType::LIVEVIEW_LOCKSCREEN,
118        AppExecFwk::ExtensionAbilityType::SHARE,
119        AppExecFwk::ExtensionAbilityType::ACTION,
120        AppExecFwk::ExtensionAbilityType::STATUS_BAR_VIEW,
121        AppExecFwk::ExtensionAbilityType::VOIP
122    };
123    return uiExtensionStartingSet.find(type) != uiExtensionStartingSet.end();
124}
125
126// In this collection, extension can be embedded by public app, which requires vertical businesses to ensure security.
127inline bool IsPublicForEmbedded(const AppExecFwk::ExtensionAbilityType type)
128{
129    const std::unordered_set<AppExecFwk::ExtensionAbilityType> publicForEmbeddedSet = {
130        AppExecFwk::ExtensionAbilityType::EMBEDDED_UI, // EMBEDDED_UI usage within the app
131        AppExecFwk::ExtensionAbilityType::ADS,
132        AppExecFwk::ExtensionAbilityType::SYSPICKER_MEDIACONTROL,
133        AppExecFwk::ExtensionAbilityType::SYS_VISUAL,
134        AppExecFwk::ExtensionAbilityType::AUTO_FILL_SMART,
135        AppExecFwk::ExtensionAbilityType::AUTO_FILL_PASSWORD
136    };
137    return publicForEmbeddedSet.find(type) != publicForEmbeddedSet.end();
138}
139
140// In this collection, extension can be embedded by public app, which some UX effects are constrained
141inline bool IsPublicForConstrainedEmbedded(const AppExecFwk::ExtensionAbilityType type)
142{
143    const std::unordered_set<AppExecFwk::ExtensionAbilityType> publicForConstrainedEmbeddedSet = {
144        AppExecFwk::ExtensionAbilityType::SYSPICKER_PHOTOPICKER,
145        AppExecFwk::ExtensionAbilityType::RECENT_PHOTO
146    };
147    return publicForConstrainedEmbeddedSet.find(type) != publicForConstrainedEmbeddedSet.end();
148}
149
150inline bool IsEnterpriseAdmin(const AppExecFwk::ExtensionAbilityType type)
151{
152    bool enterpriseAdminSa = (IPCSkeleton::GetCallingUid() == EDM_SA_UID);
153    bool isEnterpriseAdmin = (type == AppExecFwk::ExtensionAbilityType::ENTERPRISE_ADMIN);
154    return enterpriseAdminSa && isEnterpriseAdmin;
155}
156
157inline bool IsWindowExtension(const AppExecFwk::ExtensionAbilityType type)
158{
159    return type == AppExecFwk::ExtensionAbilityType::WINDOW;
160}
161} // namespace UIExtensionUtils
162} // namespace AAFwk
163} // namespace OHOS
164#endif // OHOS_AAFwk_UI_EXTENSION_UTILS_H
165