1f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko/*
2f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * Copyright (C) 2016 The Android Open Source Project
3f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko *
4f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * Licensed under the Apache License, Version 2.0 (the "License");
5f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * you may not use this file except in compliance with the License.
6f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * You may obtain a copy of the License at
7f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko *
8f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko *      http://www.apache.org/licenses/LICENSE-2.0
9f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko *
10f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * Unless required by applicable law or agreed to in writing, software
11f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * distributed under the License is distributed on an "AS IS" BASIS,
12f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * See the License for the specific language governing permissions and
14f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * limitations under the License.
15f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko */
16f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
17f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkopackage com.android.server;
18f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
1967e97053c5efea9396be420e5b5015cd808ab417Andrew Sappersteinimport android.Manifest;
2067e97053c5efea9396be420e5b5015cd808ab417Andrew Sappersteinimport android.app.ActivityManager;
21f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.app.admin.DevicePolicyManager;
22f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.content.Context;
23f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.content.pm.PackageManager;
24f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.os.Binder;
25f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.os.CpuUsageInfo;
26f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.os.IHardwarePropertiesManager;
27eb84552ef0135c1069f67a12f2e9985d4191880fPolina Bondarenkoimport android.os.Process;
288f1d5cbabb3bc4ef61b9c2edc70fcfd5d75efec8Ruben Brunkimport android.os.UserHandle;
298f1d5cbabb3bc4ef61b9c2edc70fcfd5d75efec8Ruben Brunkimport com.android.server.vr.VrManagerInternal;
30f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
31f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport java.util.Arrays;
32f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
33f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko/**
34f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * Service for {@link HardwarePropertiesManager}
35f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko */
36f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkopublic class HardwarePropertiesManagerService extends IHardwarePropertiesManager.Stub {
37f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
38f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    private static native void nativeInit();
39f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
40f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    private static native float[] nativeGetFanSpeeds();
41eb84552ef0135c1069f67a12f2e9985d4191880fPolina Bondarenko    private static native float[] nativeGetDeviceTemperatures(int type, int source);
42f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    private static native CpuUsageInfo[] nativeGetCpuUsages();
43f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
44f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    private final Context mContext;
45f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    private final Object mLock = new Object();
46f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
47f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    public HardwarePropertiesManagerService(Context context) {
48f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        mContext = context;
49f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        synchronized (mLock) {
50f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko            nativeInit();
51f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        }
52f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    }
53f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
54f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    @Override
55eb84552ef0135c1069f67a12f2e9985d4191880fPolina Bondarenko    public float[] getDeviceTemperatures(String callingPackage, int type, int source)
56eb84552ef0135c1069f67a12f2e9985d4191880fPolina Bondarenko            throws SecurityException {
57f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        enforceHardwarePropertiesRetrievalAllowed(callingPackage);
58f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        synchronized (mLock) {
59eb84552ef0135c1069f67a12f2e9985d4191880fPolina Bondarenko            return nativeGetDeviceTemperatures(type, source);
60f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        }
61f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    }
62f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
63f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    @Override
64f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    public CpuUsageInfo[] getCpuUsages(String callingPackage) throws SecurityException {
65f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        enforceHardwarePropertiesRetrievalAllowed(callingPackage);
66f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        synchronized (mLock) {
67f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko            return nativeGetCpuUsages();
68f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        }
69f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    }
70f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
71f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    @Override
72f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    public float[] getFanSpeeds(String callingPackage) throws SecurityException {
73f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        enforceHardwarePropertiesRetrievalAllowed(callingPackage);
74f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        synchronized (mLock) {
75f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko            return nativeGetFanSpeeds();
76f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        }
77f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    }
78f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
79f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    /**
80f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko     * Throws SecurityException if the calling package is not allowed to retrieve information
81f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko     * provided by the service.
82f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko     *
83f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko     * @param callingPackage The calling package name.
84f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko     *
8567e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein     * @throws SecurityException if something other than the profile or device owner, the
8667e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein     *        current VR service, or a caller holding the {@link Manifest.permission#DEVICE_POWER}
8767e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein     *        permission tries to retrieve information provided by this service.
88f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko     */
89f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage)
90f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko            throws SecurityException {
91f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        final PackageManager pm = mContext.getPackageManager();
928f1d5cbabb3bc4ef61b9c2edc70fcfd5d75efec8Ruben Brunk        int uid = 0;
93f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        try {
948f1d5cbabb3bc4ef61b9c2edc70fcfd5d75efec8Ruben Brunk            uid = pm.getPackageUid(callingPackage, 0);
95f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko            if (Binder.getCallingUid() != uid) {
96f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko                throw new SecurityException("The caller has faked the package name.");
97f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko            }
98f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        } catch (PackageManager.NameNotFoundException e) {
99f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko            throw new SecurityException("The caller has faked the package name.");
100f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        }
101f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko
1028f1d5cbabb3bc4ef61b9c2edc70fcfd5d75efec8Ruben Brunk        final int userId = UserHandle.getUserId(uid);
1038f1d5cbabb3bc4ef61b9c2edc70fcfd5d75efec8Ruben Brunk        final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
104f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
105eb84552ef0135c1069f67a12f2e9985d4191880fPolina Bondarenko        if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage)
10667e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein                && !vrService.isCurrentVrListener(callingPackage, userId)
10767e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein                && mContext.checkCallingOrSelfPermission(Manifest.permission.DEVICE_POWER)
10867e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein                        != PackageManager.PERMISSION_GRANTED) {
10967e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein            throw new SecurityException("The caller is not a device or profile owner, bound "
11067e97053c5efea9396be420e5b5015cd808ab417Andrew Sapperstein                + "VrListenerService, or holding the DEVICE_POWER permission.");
111f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko        }
112f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko    }
113f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko}
114