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
19cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootimport java.util.HashSet;
20cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
21cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root/**
22cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root * Settings data for a particular shared user ID we know about.
23cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root */
24cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Rootfinal class SharedUserSetting extends GrantedPermissions {
25cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final String name;
26cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
27cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    int userId;
28cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
29dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver    // flags that are associated with this uid, regardless of any package flags
30dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver    int uidFlags;
31dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver
32cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final HashSet<PackageSetting> packages = new HashSet<PackageSetting>();
33cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
34cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    final PackageSignatures signatures = new PackageSignatures();
35cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
36cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    SharedUserSetting(String _name, int _pkgFlags) {
37cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        super(_pkgFlags);
38dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        uidFlags =  _pkgFlags;
39cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        name = _name;
40cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
41cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root
42cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    @Override
43cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    public String toString() {
44cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root        return "SharedUserSetting{" + Integer.toHexString(System.identityHashCode(this)) + " "
45cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root                + name + "/" + userId + "}";
46cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root    }
47dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver
48dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver    void removePackage(PackageSetting packageSetting) {
49dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        if (packages.remove(packageSetting)) {
50dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver            // recalculate the pkgFlags for this shared user if needed
51dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver            if ((this.pkgFlags & packageSetting.pkgFlags) != 0) {
52dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver                int aggregatedFlags = uidFlags;
53dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver                for (PackageSetting ps : packages) {
54dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver                    aggregatedFlags |= ps.pkgFlags;
55dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver                }
56dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver                setFlags(aggregatedFlags);
57dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver            }
58dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        }
59dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver    }
60dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver
61dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver    void addPackage(PackageSetting packageSetting) {
62dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        if (packages.add(packageSetting)) {
63dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver            setFlags(this.pkgFlags | packageSetting.pkgFlags);
64dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver        }
65dd72c9ed558158f889a8cdfed8a108553ba5a562Ben Gruver    }
66cf0b38ca6e5aa5efded7dbdbb623f6cd2746c96aKenny Root}
67