blob: 36a16cd0a18b60fbe8584bdd868832b711ead75e [file] [log] [blame]
Polina Bondarenkof8754ac2016-02-12 20:38:23 +01001/*
2 * Copyright (C) 2016 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
17package com.android.server;
18
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -080019import android.Manifest;
20import android.app.ActivityManager;
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010021import android.app.admin.DevicePolicyManager;
22import android.content.Context;
23import android.content.pm.PackageManager;
24import android.os.Binder;
25import android.os.CpuUsageInfo;
26import android.os.IHardwarePropertiesManager;
Polina Bondarenkoeb845522016-03-01 14:39:48 +010027import android.os.Process;
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070028import android.os.UserHandle;
29import com.android.server.vr.VrManagerInternal;
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010030
31import java.util.Arrays;
32
33/**
34 * Service for {@link HardwarePropertiesManager}
35 */
36public class HardwarePropertiesManagerService extends IHardwarePropertiesManager.Stub {
37
38 private static native void nativeInit();
39
40 private static native float[] nativeGetFanSpeeds();
Polina Bondarenkoeb845522016-03-01 14:39:48 +010041 private static native float[] nativeGetDeviceTemperatures(int type, int source);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010042 private static native CpuUsageInfo[] nativeGetCpuUsages();
43
44 private final Context mContext;
45 private final Object mLock = new Object();
46
47 public HardwarePropertiesManagerService(Context context) {
48 mContext = context;
49 synchronized (mLock) {
50 nativeInit();
51 }
52 }
53
54 @Override
Polina Bondarenkoeb845522016-03-01 14:39:48 +010055 public float[] getDeviceTemperatures(String callingPackage, int type, int source)
56 throws SecurityException {
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010057 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
58 synchronized (mLock) {
Polina Bondarenkoeb845522016-03-01 14:39:48 +010059 return nativeGetDeviceTemperatures(type, source);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010060 }
61 }
62
63 @Override
64 public CpuUsageInfo[] getCpuUsages(String callingPackage) throws SecurityException {
65 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
66 synchronized (mLock) {
67 return nativeGetCpuUsages();
68 }
69 }
70
71 @Override
72 public float[] getFanSpeeds(String callingPackage) throws SecurityException {
73 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
74 synchronized (mLock) {
75 return nativeGetFanSpeeds();
76 }
77 }
78
79 /**
80 * Throws SecurityException if the calling package is not allowed to retrieve information
81 * provided by the service.
82 *
83 * @param callingPackage The calling package name.
84 *
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -080085 * @throws SecurityException if something other than the profile or device owner, the
86 * current VR service, or a caller holding the {@link Manifest.permission#DEVICE_POWER}
87 * permission tries to retrieve information provided by this service.
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010088 */
89 private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage)
90 throws SecurityException {
91 final PackageManager pm = mContext.getPackageManager();
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070092 int uid = 0;
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010093 try {
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070094 uid = pm.getPackageUid(callingPackage, 0);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010095 if (Binder.getCallingUid() != uid) {
96 throw new SecurityException("The caller has faked the package name.");
97 }
98 } catch (PackageManager.NameNotFoundException e) {
99 throw new SecurityException("The caller has faked the package name.");
100 }
101
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -0700102 final int userId = UserHandle.getUserId(uid);
103 final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +0100104 final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
Polina Bondarenkoeb845522016-03-01 14:39:48 +0100105 if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage)
Andrew Sappersteinb7caf1d2016-12-14 15:39:20 -0800106 && !vrService.isCurrentVrListener(callingPackage, userId)
107 && mContext.checkCallingOrSelfPermission(Manifest.permission.DEVICE_POWER)
108 != PackageManager.PERMISSION_GRANTED) {
109 throw new SecurityException("The caller is not a device or profile owner, bound "
110 + "VrListenerService, or holding the DEVICE_POWER permission.");
Polina Bondarenkof8754ac2016-02-12 20:38:23 +0100111 }
112 }
113}