1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.pm;
18 
19 import android.annotation.IntDef;
20 import android.annotation.NonNull;
21 import android.text.TextUtils;
22 
23 import com.android.internal.util.ArrayUtils;
24 
25 import java.lang.annotation.Retention;
26 import java.lang.annotation.RetentionPolicy;
27 
28 /**
29  * Helps {@link PackageManagerService} keep track of the names of special packages like SetupWizard.
30  */
31 public final class KnownPackages {
32     @IntDef(prefix = "PACKAGE_", value = {
33             PACKAGE_SYSTEM,
34             PACKAGE_SETUP_WIZARD,
35             PACKAGE_INSTALLER,
36             PACKAGE_UNINSTALLER,
37             PACKAGE_VERIFIER,
38             PACKAGE_BROWSER,
39             PACKAGE_SYSTEM_TEXT_CLASSIFIER,
40             PACKAGE_PERMISSION_CONTROLLER,
41             PACKAGE_CONFIGURATOR,
42             PACKAGE_INCIDENT_REPORT_APPROVER,
43             PACKAGE_APP_PREDICTOR,
44             PACKAGE_OVERLAY_CONFIG_SIGNATURE,
45             PACKAGE_WIFI,
46             PACKAGE_COMPANION,
47             PACKAGE_RETAIL_DEMO,
48             PACKAGE_RECENTS,
49             PACKAGE_AMBIENT_CONTEXT_DETECTION,
50             PACKAGE_WEARABLE_SENSING,
51     })
52     @Retention(RetentionPolicy.SOURCE)
53     public @interface KnownPackage {
54     }
55 
56     public static final int PACKAGE_SYSTEM = 0;
57     public static final int PACKAGE_SETUP_WIZARD = 1;
58     public static final int PACKAGE_INSTALLER = 2;
59     public static final int PACKAGE_UNINSTALLER = 3;
60     public static final int PACKAGE_VERIFIER = 4;
61     public static final int PACKAGE_BROWSER = 5;
62     public static final int PACKAGE_SYSTEM_TEXT_CLASSIFIER = 6;
63     public static final int PACKAGE_PERMISSION_CONTROLLER = 7;
64     public static final int PACKAGE_WELLBEING = 8;
65     public static final int PACKAGE_DOCUMENTER = 9;
66     public static final int PACKAGE_CONFIGURATOR = 10;
67     public static final int PACKAGE_INCIDENT_REPORT_APPROVER = 11;
68     public static final int PACKAGE_APP_PREDICTOR = 12;
69     public static final int PACKAGE_OVERLAY_CONFIG_SIGNATURE = 13;
70     public static final int PACKAGE_WIFI = 14;
71     public static final int PACKAGE_COMPANION = 15;
72     public static final int PACKAGE_RETAIL_DEMO = 16;
73     public static final int PACKAGE_RECENTS = 17;
74     public static final int PACKAGE_AMBIENT_CONTEXT_DETECTION = 18;
75     public static final int PACKAGE_WEARABLE_SENSING = 19;
76     // Integer value of the last known package ID. Increases as new ID is added to KnownPackage.
77     // Please note the numbers should be continuous.
78     public static final int LAST_KNOWN_PACKAGE = PACKAGE_WEARABLE_SENSING;
79 
80     private final DefaultAppProvider mDefaultAppProvider;
81     private final String mRequiredInstallerPackage;
82     private final String mRequiredUninstallerPackage;
83     private final String mSetupWizardPackage;
84     private final String[] mRequiredVerifierPackages;
85     private final String mDefaultTextClassifierPackage;
86     private final String mSystemTextClassifierPackageName;
87     private final String mRequiredPermissionControllerPackage;
88     private final String mConfiguratorPackage;
89     private final String mIncidentReportApproverPackage;
90     private final String mAmbientContextDetectionPackage;
91     private final String mWearableSensingPackage;
92     private final String mAppPredictionServicePackage;
93     private final String mCompanionPackage;
94     private final String mRetailDemoPackage;
95     private final String mOverlayConfigSignaturePackage;
96     private final String mRecentsPackage;
97 
KnownPackages(DefaultAppProvider defaultAppProvider, String requiredInstallerPackage, String requiredUninstallerPackage, String setupWizardPackage, String[] requiredVerifierPackages, String defaultTextClassifierPackage, String systemTextClassifierPackageName, String requiredPermissionControllerPackage, String configuratorPackage, String incidentReportApproverPackage, String ambientContextDetectionPackage, String wearableSensingPackage, String appPredictionServicePackage, String companionPackageName, String retailDemoPackage, String overlayConfigSignaturePackage, String recentsPackage)98     KnownPackages(DefaultAppProvider defaultAppProvider, String requiredInstallerPackage,
99             String requiredUninstallerPackage, String setupWizardPackage,
100             String[] requiredVerifierPackages, String defaultTextClassifierPackage,
101             String systemTextClassifierPackageName, String requiredPermissionControllerPackage,
102             String configuratorPackage, String incidentReportApproverPackage,
103             String ambientContextDetectionPackage, String wearableSensingPackage,
104             String appPredictionServicePackage, String companionPackageName,
105             String retailDemoPackage, String overlayConfigSignaturePackage, String recentsPackage) {
106         mDefaultAppProvider = defaultAppProvider;
107         mRequiredInstallerPackage = requiredInstallerPackage;
108         mRequiredUninstallerPackage = requiredUninstallerPackage;
109         mSetupWizardPackage = setupWizardPackage;
110         mRequiredVerifierPackages = requiredVerifierPackages;
111         mDefaultTextClassifierPackage = defaultTextClassifierPackage;
112         mSystemTextClassifierPackageName = systemTextClassifierPackageName;
113         mRequiredPermissionControllerPackage = requiredPermissionControllerPackage;
114         mConfiguratorPackage = configuratorPackage;
115         mIncidentReportApproverPackage = incidentReportApproverPackage;
116         mAmbientContextDetectionPackage = ambientContextDetectionPackage;
117         mWearableSensingPackage = wearableSensingPackage;
118         mAppPredictionServicePackage = appPredictionServicePackage;
119         mCompanionPackage = companionPackageName;
120         mRetailDemoPackage = retailDemoPackage;
121         mOverlayConfigSignaturePackage = overlayConfigSignaturePackage;
122         mRecentsPackage = recentsPackage;
123     }
124 
125     /**
126      * Returns the string representation of a known package. For example,
127      * {@link #PACKAGE_SETUP_WIZARD} is represented by the string Setup Wizard.
128      *
129      * @param knownPackage The known package.
130      * @return The string representation.
131      */
knownPackageToString(@nownPackage int knownPackage)132     static @NonNull String knownPackageToString(@KnownPackage int knownPackage) {
133         switch (knownPackage) {
134             case PACKAGE_SYSTEM:
135                 return "System";
136             case PACKAGE_SETUP_WIZARD:
137                 return "Setup Wizard";
138             case PACKAGE_INSTALLER:
139                 return "Installer";
140             case PACKAGE_UNINSTALLER:
141                 return "Uninstaller";
142             case PACKAGE_VERIFIER:
143                 return "Verifier";
144             case PACKAGE_BROWSER:
145                 return "Browser";
146             case PACKAGE_SYSTEM_TEXT_CLASSIFIER:
147                 return "System Text Classifier";
148             case PACKAGE_PERMISSION_CONTROLLER:
149                 return "Permission Controller";
150             case PACKAGE_WELLBEING:
151                 return "Wellbeing";
152             case PACKAGE_DOCUMENTER:
153                 return "Documenter";
154             case PACKAGE_CONFIGURATOR:
155                 return "Configurator";
156             case PACKAGE_INCIDENT_REPORT_APPROVER:
157                 return "Incident Report Approver";
158             case PACKAGE_APP_PREDICTOR:
159                 return "App Predictor";
160             case PACKAGE_WIFI:
161                 return "Wi-Fi";
162             case PACKAGE_COMPANION:
163                 return "Companion";
164             case PACKAGE_RETAIL_DEMO:
165                 return "Retail Demo";
166             case PACKAGE_OVERLAY_CONFIG_SIGNATURE:
167                 return "Overlay Config Signature";
168             case PACKAGE_RECENTS:
169                 return "Recents";
170             case PACKAGE_AMBIENT_CONTEXT_DETECTION:
171                 return "Ambient Context Detection";
172             case PACKAGE_WEARABLE_SENSING:
173                 return "Wearable sensing";
174         }
175         return "Unknown";
176     }
177 
getKnownPackageNames(@onNull Computer snapshot, int knownPackage, int userId)178     String[] getKnownPackageNames(@NonNull Computer snapshot, int knownPackage, int userId) {
179         switch (knownPackage) {
180             case PACKAGE_BROWSER:
181                 return new String[]{mDefaultAppProvider.getDefaultBrowser(userId)};
182             case PACKAGE_INSTALLER:
183                 return snapshot.filterOnlySystemPackages(mRequiredInstallerPackage);
184             case PACKAGE_UNINSTALLER:
185                 return snapshot.filterOnlySystemPackages(mRequiredUninstallerPackage);
186             case PACKAGE_SETUP_WIZARD:
187                 return snapshot.filterOnlySystemPackages(mSetupWizardPackage);
188             case PACKAGE_SYSTEM:
189                 return new String[]{"android"};
190             case PACKAGE_VERIFIER:
191                 return snapshot.filterOnlySystemPackages(mRequiredVerifierPackages);
192             case PACKAGE_SYSTEM_TEXT_CLASSIFIER:
193                 return snapshot.filterOnlySystemPackages(
194                         mDefaultTextClassifierPackage, mSystemTextClassifierPackageName);
195             case PACKAGE_PERMISSION_CONTROLLER:
196                 return snapshot.filterOnlySystemPackages(mRequiredPermissionControllerPackage);
197             case PACKAGE_CONFIGURATOR:
198                 return snapshot.filterOnlySystemPackages(mConfiguratorPackage);
199             case PACKAGE_INCIDENT_REPORT_APPROVER:
200                 return snapshot.filterOnlySystemPackages(mIncidentReportApproverPackage);
201             case PACKAGE_AMBIENT_CONTEXT_DETECTION:
202                 return snapshot.filterOnlySystemPackages(mAmbientContextDetectionPackage);
203             case PACKAGE_WEARABLE_SENSING:
204                 return snapshot.filterOnlySystemPackages(mWearableSensingPackage);
205             case PACKAGE_APP_PREDICTOR:
206                 return snapshot.filterOnlySystemPackages(mAppPredictionServicePackage);
207             case PACKAGE_COMPANION:
208                 return snapshot.filterOnlySystemPackages(mCompanionPackage);
209             case PACKAGE_RETAIL_DEMO:
210                 return TextUtils.isEmpty(mRetailDemoPackage)
211                         ? ArrayUtils.emptyArray(String.class)
212                         : new String[]{mRetailDemoPackage};
213             case PACKAGE_OVERLAY_CONFIG_SIGNATURE:
214                 return snapshot.filterOnlySystemPackages(mOverlayConfigSignaturePackage);
215             case PACKAGE_RECENTS:
216                 return snapshot.filterOnlySystemPackages(mRecentsPackage);
217             default:
218                 return ArrayUtils.emptyArray(String.class);
219         }
220     }
221 }
222