1cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/*
2cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Copyright (C) 2011 The Android Open Source Project
3cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
4cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * you may not use this file except in compliance with the License.
6cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * You may obtain a copy of the License at
7cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
8cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root *
10cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Unless required by applicable law or agreed to in writing, software
11cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * See the License for the specific language governing permissions and
14cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * limitations under the License.
15cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
16cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
17cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootpackage com.android.server.pm;
18cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
19628946a6efd7931fac59b3236b58b53c58c6bf20Christopher Tateimport android.content.pm.ApplicationInfo;
20c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkeyimport android.content.pm.PackageManager;
21cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport android.content.pm.PackageParser;
22426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta Pimport android.content.pm.UserInfo;
23426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta Pimport android.service.pm.PackageProto;
24426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta Pimport android.util.proto.ProtoOutputStream;
25cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
2682b0842051a93764e96a68072da1a220f00c2c27Todd Kennedyimport com.android.server.pm.permission.PermissionsState;
2782b0842051a93764e96a68072da1a220f00c2c27Todd Kennedy
28cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.io.File;
29354cd3ce2213a1032d9138ea6fa1420f055ab08cSvet Ganovimport java.util.List;
30cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
31cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/**
32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Settings data for a particular package we know about.
33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
3482b0842051a93764e96a68072da1a220f00c2c27Todd Kennedypublic final class PackageSetting extends PackageSettingBase {
35135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani    int appId;
36cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    PackageParser.Package pkg;
373cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy    /**
383cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     * WARNING. The object reference is important. We perform integer equality and NOT
393cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     * object equality to check whether shared user settings are the same.
403cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     */
41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    SharedUserSetting sharedUser;
42788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    /**
43788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy     * Temporary holding space for the shared user ID. While parsing package settings, the
443cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     * shared users tag may come after the packages. In this case, we must delay linking the
45788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy     * shared user setting with the package setting. The shared user ID lets us link the
46788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy     * two objects.
47788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy     */
48788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    private int sharedUserId;
49cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
50cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    PackageSetting(String name, String realName, File codePath, File resourcePath,
51ff110bd61a69f7ed8602ae14b27f7befec76b2e7Narayan Kamath            String legacyNativeLibraryPathString, String primaryCpuAbiString,
524903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath            String secondaryCpuAbiString, String cpuAbiOverrideString,
533accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn            long pVersionCode, int pkgFlags, int privateFlags, String parentPackageName,
546788212d17f54475ca9c3dd689a863e031db868fSvet Ganov            List<String> childPackageNames, int sharedUserId, String[] usesStaticLibraries,
553accca05ddcad9d0b1b313eae49f273e39121d3cDianne Hackborn            long[] usesStaticLibrariesVersions) {
56ff110bd61a69f7ed8602ae14b27f7befec76b2e7Narayan Kamath        super(name, realName, codePath, resourcePath, legacyNativeLibraryPathString,
574903f64ba2478849e6c401f42f5a77c1d4f9f7dfNarayan Kamath                primaryCpuAbiString, secondaryCpuAbiString, cpuAbiOverrideString,
586788212d17f54475ca9c3dd689a863e031db868fSvet Ganov                pVersionCode, pkgFlags, privateFlags, parentPackageName, childPackageNames,
596788212d17f54475ca9c3dd689a863e031db868fSvet Ganov                usesStaticLibraries, usesStaticLibrariesVersions);
60788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        this.sharedUserId = sharedUserId;
61cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
62cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
63cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    /**
64cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * New instance of PackageSetting replicating the original settings.
65cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     * Note that it keeps the same PackageParser.Package instance.
66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root     */
67cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    PackageSetting(PackageSetting orig) {
683cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy        super(orig, orig.realName);
693cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy        doCopy(orig);
703cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy    }
713cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy
723cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy    /**
733cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     * New instance of PackageSetting replicating the original settings, but, allows specifying
743cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     * a real package name.
753cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     * Note that it keeps the same PackageParser.Package instance.
763cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy     */
773cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy    PackageSetting(PackageSetting orig, String realPkgName) {
783cd658e1a598e59738bc129c35eecf4cd0f20680Todd Kennedy        super(orig, realPkgName);
79788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        doCopy(orig);
80788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    }
81cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
82788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    public int getSharedUserId() {
83788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        if (sharedUser != null) {
84788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy            return sharedUser.userId;
85788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        }
86788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        return sharedUserId;
87cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
88cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
89c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    public SharedUserSetting getSharedUser() {
90c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy        return sharedUser;
91c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    }
92c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy
93cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    @Override
94cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    public String toString() {
95cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return "PackageSetting{"
96cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root            + Integer.toHexString(System.identityHashCode(this))
97135936072b24b090fb63940aea41b408d855a4f3Amith Yamasani            + " " + name + "/" + appId + "}";
98cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
9902e4d16ed9a0499ad72f2ff427e8bf0e85d7ae06Jeff Sharkey
100788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    public void copyFrom(PackageSetting orig) {
101788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        super.copyFrom(orig);
102788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        doCopy(orig);
103788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    }
104788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy
105788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    private void doCopy(PackageSetting orig) {
106788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        appId = orig.appId;
107788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        pkg = orig.pkg;
108788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        sharedUser = orig.sharedUser;
109788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy        sharedUserId = orig.sharedUserId;
110788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy    }
111788c8423d19972389b82a23dec297eb27d819c86Todd Kennedy
11291a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    @Override
113c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav    public PermissionsState getPermissionsState() {
114c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav        return (sharedUser != null)
115c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav                ? sharedUser.getPermissionsState()
116c6d1c345f41cf817bf2c07c97b97107d94296064Svetoslav                : super.getPermissionsState();
11702e4d16ed9a0499ad72f2ff427e8bf0e85d7ae06Jeff Sharkey    }
118628946a6efd7931fac59b3236b58b53c58c6bf20Christopher Tate
11982b0842051a93764e96a68072da1a220f00c2c27Todd Kennedy    public PackageParser.Package getPackage() {
12082b0842051a93764e96a68072da1a220f00c2c27Todd Kennedy        return pkg;
12182b0842051a93764e96a68072da1a220f00c2c27Todd Kennedy    }
12282b0842051a93764e96a68072da1a220f00c2c27Todd Kennedy
1230eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy    public int getAppId() {
1240eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy        return appId;
1250eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy    }
1260eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy
127c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    public void setInstallPermissionsFixed(boolean fixed) {
128c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy        installPermissionsFixed = fixed;
129c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    }
130c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy
131c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    public boolean areInstallPermissionsFixed() {
132c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy        return installPermissionsFixed;
133c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    }
134c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy
135628946a6efd7931fac59b3236b58b53c58c6bf20Christopher Tate    public boolean isPrivileged() {
136b9f8a5204a1b0b3919fa921e858d04124c582828Alex Klyubin        return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
137628946a6efd7931fac59b3236b58b53c58c6bf20Christopher Tate    }
138eeea67b8c3678d882d3774edc41242c63daa60faFyodor Kupolov
139087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov    public boolean isOem() {
140087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov        return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_OEM) != 0;
141087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov    }
142087dce20e3a7137e94607c060fd825d1f8952572Svet Ganov
143002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park    public boolean isVendor() {
144002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park        return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_VENDOR) != 0;
145002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park    }
146002fdbdb950ebbf40331a27de33b80db33e40d30Jiyong Park
1471713d9e97aada3dc695800c18b1025238a11629dJaekyun Seok    public boolean isProduct() {
1481713d9e97aada3dc695800c18b1025238a11629dJaekyun Seok        return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_PRODUCT) != 0;
1491713d9e97aada3dc695800c18b1025238a11629dJaekyun Seok    }
1501713d9e97aada3dc695800c18b1025238a11629dJaekyun Seok
151eeea67b8c3678d882d3774edc41242c63daa60faFyodor Kupolov    public boolean isForwardLocked() {
152eeea67b8c3678d882d3774edc41242c63daa60faFyodor Kupolov        return (pkgPrivateFlags & ApplicationInfo.PRIVATE_FLAG_FORWARD_LOCK) != 0;
153eeea67b8c3678d882d3774edc41242c63daa60faFyodor Kupolov    }
15412a692a5e8244cad6ae634cc0821e4e3590cfef6Svet Ganov
15512a692a5e8244cad6ae634cc0821e4e3590cfef6Svet Ganov    public boolean isSystem() {
15612a692a5e8244cad6ae634cc0821e4e3590cfef6Svet Ganov        return (pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0;
15712a692a5e8244cad6ae634cc0821e4e3590cfef6Svet Ganov    }
158d2cf3aec6087ba53dcbb55eb38c8e7f385ac4cbdSvetoslav
159c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    public boolean isUpdatedSystem() {
160c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy        return (pkgFlags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
161c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy    }
162c29b11a5f65829dc87b5f234c4d3c1fff7ef5a36Todd Kennedy
16391a39d126d1f6efa47948ca1039ca347c1bd19e6Todd Kennedy    @Override
164d2cf3aec6087ba53dcbb55eb38c8e7f385ac4cbdSvetoslav    public boolean isSharedUser() {
165d2cf3aec6087ba53dcbb55eb38c8e7f385ac4cbdSvetoslav        return sharedUser != null;
166d2cf3aec6087ba53dcbb55eb38c8e7f385ac4cbdSvetoslav    }
167c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkey
168c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkey    public boolean isMatch(int flags) {
169c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkey        if ((flags & PackageManager.MATCH_SYSTEM_ONLY) != 0) {
170c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkey            return isSystem();
171c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkey        }
172c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkey        return true;
173c5967e9862489024c932b0c7fcb84ed0af2a7fd7Jeff Sharkey    }
174426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P
1750eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy    public boolean hasChildPackages() {
1760eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy        return childPackageNames != null && !childPackageNames.isEmpty();
1770eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy    }
1780eb9738d1708d9aa7846782046e6828ffc9fe901Todd Kennedy
179426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P    public void writeToProto(ProtoOutputStream proto, long fieldId, List<UserInfo> users) {
180426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        final long packageToken = proto.start(fieldId);
181426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.write(PackageProto.NAME, (realName != null ? realName : name));
182426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.write(PackageProto.UID, appId);
183426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.write(PackageProto.VERSION_CODE, versionCode);
184426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.write(PackageProto.VERSION_STRING, pkg.mVersionName);
185426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.write(PackageProto.INSTALL_TIME_MS, firstInstallTime);
186426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.write(PackageProto.UPDATE_TIME_MS, lastUpdateTime);
187426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.write(PackageProto.INSTALLER_NAME, installerPackageName);
188426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P
189426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        if (pkg != null) {
190426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P            long splitToken = proto.start(PackageProto.SPLITS);
191426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P            proto.write(PackageProto.SplitProto.NAME, "base");
192426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P            proto.write(PackageProto.SplitProto.REVISION_CODE, pkg.baseRevisionCode);
193426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P            proto.end(splitToken);
194426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P            if (pkg.splitNames != null) {
195426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P                for (int i = 0; i < pkg.splitNames.length; i++) {
196426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P                    splitToken = proto.start(PackageProto.SPLITS);
197426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P                    proto.write(PackageProto.SplitProto.NAME, pkg.splitNames[i]);
198426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P                    proto.write(PackageProto.SplitProto.REVISION_CODE, pkg.splitRevisionCodes[i]);
199426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P                    proto.end(splitToken);
200426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P                }
201426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P            }
202426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        }
203426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        writeUsersInfoToProto(proto, PackageProto.USERS);
204426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P        proto.end(packageToken);
205426cbefdf3c78bd0aa80b180ffc1fb8b5a226bc3Netta P    }
20602e4d16ed9a0499ad72f2ff427e8bf0e85d7ae06Jeff Sharkey}
207