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