1 /*
2  * Copyright (C) 2019 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.content.pm.SigningDetails;
20 import android.util.SparseArray;
21 
22 import com.android.server.pm.parsing.pkg.ParsedPackage;
23 import com.android.server.pm.pkg.AndroidPackage;
24 import com.android.server.pm.pkg.PackageUserStateImpl;
25 
26 import java.io.File;
27 import java.util.Map;
28 import java.util.Set;
29 import java.util.UUID;
30 
31 public class PackageSettingBuilder {
32     private String mName;
33     private String mRealName;
34     private String mCodePath;
35     private String mLegacyNativeLibraryPathString;
36     private String mPrimaryCpuAbiString;
37     private String mSecondaryCpuAbiString;
38     private String mCpuAbiOverrideString;
39     private long mPVersionCode;
40     private int mPkgFlags;
41     private int mPrivateFlags;
42     private int mSharedUserId;
43     private String mVolumeUuid;
44     private int mAppId;
45     private SparseArray<PackageUserStateImpl> mUserStates = new SparseArray<>();
46     private AndroidPackage mPkg;
47     private InstallSource mInstallSource;
48     private Map<String, Set<String>> mMimeGroups;
49     private SigningDetails mSigningDetails;
50     private UUID mDomainSetId = UUID.randomUUID();
51 
setPackage(AndroidPackage pkg)52     public PackageSettingBuilder setPackage(AndroidPackage pkg) {
53         this.mPkg = pkg;
54         return this;
55     }
56 
setName(String name)57     public PackageSettingBuilder setName(String name) {
58         this.mName = name;
59         return this;
60     }
61 
setAppId(int appId)62     public PackageSettingBuilder setAppId(int appId) {
63         this.mAppId = appId;
64         return this;
65     }
66 
setRealName(String realName)67     public PackageSettingBuilder setRealName(String realName) {
68         this.mRealName = realName;
69         return this;
70     }
71 
setCodePath(String codePath)72     public PackageSettingBuilder setCodePath(String codePath) {
73         this.mCodePath = codePath;
74         return this;
75     }
76 
setLegacyNativeLibraryPathString( String legacyNativeLibraryPathString)77     public PackageSettingBuilder setLegacyNativeLibraryPathString(
78             String legacyNativeLibraryPathString) {
79         this.mLegacyNativeLibraryPathString = legacyNativeLibraryPathString;
80         return this;
81     }
82 
setPrimaryCpuAbiString(String primaryCpuAbiString)83     public PackageSettingBuilder setPrimaryCpuAbiString(String primaryCpuAbiString) {
84         this.mPrimaryCpuAbiString = primaryCpuAbiString;
85         return this;
86     }
87 
setSecondaryCpuAbiString(String secondaryCpuAbiString)88     public PackageSettingBuilder setSecondaryCpuAbiString(String secondaryCpuAbiString) {
89         this.mSecondaryCpuAbiString = secondaryCpuAbiString;
90         return this;
91     }
92 
setCpuAbiOverrideString(String cpuAbiOverrideString)93     public PackageSettingBuilder setCpuAbiOverrideString(String cpuAbiOverrideString) {
94         this.mCpuAbiOverrideString = cpuAbiOverrideString;
95         return this;
96     }
97 
setPVersionCode(long pVersionCode)98     public PackageSettingBuilder setPVersionCode(long pVersionCode) {
99         this.mPVersionCode = pVersionCode;
100         return this;
101     }
102 
setPkgFlags(int pkgFlags)103     public PackageSettingBuilder setPkgFlags(int pkgFlags) {
104         this.mPkgFlags = pkgFlags;
105         return this;
106     }
107 
setPrivateFlags(int privateFlags)108     public PackageSettingBuilder setPrivateFlags(int privateFlags) {
109         this.mPrivateFlags = privateFlags;
110         return this;
111     }
112 
setSharedUserId(int sharedUserId)113     public PackageSettingBuilder setSharedUserId(int sharedUserId) {
114         this.mSharedUserId = sharedUserId;
115         return this;
116     }
117 
setMimeGroups(Map<String, Set<String>> mimeGroups)118     public PackageSettingBuilder setMimeGroups(Map<String, Set<String>> mimeGroups) {
119         this.mMimeGroups = mimeGroups;
120         return this;
121     }
122 
setVolumeUuid(String volumeUuid)123     public PackageSettingBuilder setVolumeUuid(String volumeUuid) {
124         this.mVolumeUuid = volumeUuid;
125         return this;
126     }
127 
setInstantAppUserState(int userId, boolean isInstant)128     public PackageSettingBuilder setInstantAppUserState(int userId, boolean isInstant) {
129         if (mUserStates.indexOfKey(userId) < 0) {
130             mUserStates.put(userId, new PackageUserStateImpl());
131         }
132         mUserStates.get(userId).setInstantApp(isInstant);
133         return this;
134     }
135 
setInstallState(int userId, boolean installed)136     public PackageSettingBuilder setInstallState(int userId, boolean installed) {
137         if (mUserStates.indexOfKey(userId) < 0) {
138             mUserStates.put(userId, new PackageUserStateImpl());
139         }
140         mUserStates.get(userId).setInstalled(installed);
141         return this;
142     }
143 
setInstallSource(InstallSource installSource)144     public PackageSettingBuilder setInstallSource(InstallSource installSource) {
145         mInstallSource = installSource;
146         return this;
147     }
148 
setSigningDetails( SigningDetails signingDetails)149     public PackageSettingBuilder setSigningDetails(
150             SigningDetails signingDetails) {
151         mSigningDetails = signingDetails;
152         return this;
153     }
154 
setDomainSetId(UUID domainSetId)155     public PackageSettingBuilder setDomainSetId(UUID domainSetId) {
156         mDomainSetId = domainSetId;
157         return this;
158     }
159 
build()160     public PackageSetting build() {
161         final PackageSetting packageSetting = new PackageSetting(mName, mRealName,
162                 new File(mCodePath), mLegacyNativeLibraryPathString, mPrimaryCpuAbiString,
163                 mSecondaryCpuAbiString, mCpuAbiOverrideString, mPVersionCode, mPkgFlags,
164                 mPrivateFlags, mSharedUserId, null /* usesSdkLibraries */,
165                 null /* usesSdkLibrariesVersions */, null /* usesStaticLibraries */,
166                 null  /* usesStaticLibrariesVersions */, mMimeGroups, mDomainSetId);
167         packageSetting.setSignatures(mSigningDetails != null
168                 ? new PackageSignatures(mSigningDetails)
169                 : new PackageSignatures());
170         packageSetting.setPkg((ParsedPackage) mPkg);
171         packageSetting.setAppId(mAppId);
172         packageSetting.setVolumeUuid(this.mVolumeUuid);
173         if (mInstallSource != null) {
174             packageSetting.setInstallSource(mInstallSource);
175         }
176         for (int i = 0; i < mUserStates.size(); i++) {
177             packageSetting.setUserState(mUserStates.keyAt(i), mUserStates.valueAt(i));
178         }
179         return packageSetting;
180     }
181 }
182