ProtectedPackages.java revision c29f62c7388f550da2c7368c5dbc0aec7d1564fe
1c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki/*
2c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * Copyright (C) 2016 The Android Open Source Project
3c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki *
4c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
5c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * you may not use this file except in compliance with the License.
6c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * You may obtain a copy of the License at
7c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki *
8c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
9c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki *
10c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * Unless required by applicable law or agreed to in writing, software
11c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
12c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * See the License for the specific language governing permissions and
14c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * limitations under the License.
15c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki */
16c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
17c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onukipackage com.android.server.pm;
18c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
19c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onukiimport android.annotation.UserIdInt;
20c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onukiimport android.os.UserHandle;
21c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onukiimport android.util.SparseArray;
22c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
23c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki/**
24c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * Manages package names that need special protection.
25c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki *
26c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * TODO: This class should persist the information by itself, and also keeps track of device admin
27c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * packages for all users.  Then PMS.isPackageDeviceAdmin() should use it instead of talking
28c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki * to DPMS.
29c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki */
30c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onukipublic class ProtectedPackages {
31c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    @UserIdInt
32c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    private int mDeviceOwnerUserId;
33c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
34c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    private String mDeviceOwnerPackage;
35c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
36c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    private SparseArray<String> mProfileOwnerPackages;
37c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
38c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    private final Object mLock = new Object();
39c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
40c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    /**
41c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki     * Sets the device/profile owner information.
42c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki     */
43c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    public void setDeviceAndProfileOwnerPackages(
44c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            int deviceOwnerUserId, String deviceOwnerPackage,
45c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            SparseArray<String> profileOwnerPackages) {
46c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        synchronized (mLock) {
47c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            mDeviceOwnerUserId = deviceOwnerUserId;
48c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            mDeviceOwnerPackage =
49c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                    (deviceOwnerUserId == UserHandle.USER_NULL) ? null : deviceOwnerPackage;
50c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            mProfileOwnerPackages = (profileOwnerPackages == null) ? null
51c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                    : profileOwnerPackages.clone();
52c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        }
53c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    }
54c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
55c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    private boolean hasDeviceOwnerOrProfileOwner(int userId, String packageName) {
56c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        if (packageName == null) {
57c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            return false;
58c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        }
59c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        synchronized (mLock) {
60c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            if (mDeviceOwnerPackage != null) {
61c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                if ((mDeviceOwnerUserId == userId)
62c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                        && (packageName.equals(mDeviceOwnerPackage))) {
63c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                    return true;
64c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                }
65c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            }
66c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            if (mProfileOwnerPackages != null) {
67c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                if (packageName.equals(mProfileOwnerPackages.get(userId))) {
68c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                    return true;
69c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki                }
70c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki            }
71c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        }
72c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        return false;
73c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    }
74c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
75c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    /**
76c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki     * Whether a package or the components in a package's enabled state can be changed
77c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki     * by other callers than itself.
78c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki     */
79c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    public boolean canPackageStateBeChanged(@UserIdInt int userId, String packageName) {
80c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        return hasDeviceOwnerOrProfileOwner(userId, packageName);
81c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    }
82c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki
83c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    /**
84c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki     * Whether a package's data be cleared.
85c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki     */
86c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    public boolean canPackageBeWiped(@UserIdInt int userId, String packageName) {
87c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki        return hasDeviceOwnerOrProfileOwner(userId, packageName);
88c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki    }
89c29f62c7388f550da2c7368c5dbc0aec7d1564feMakoto Onuki}
90