blob: 23cf64a031af3d072464c27917500f5262f29f35 [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
19import android.app.admin.DevicePolicyManager;
20import android.content.Context;
21import android.content.pm.PackageManager;
22import android.os.Binder;
23import android.os.CpuUsageInfo;
24import android.os.IHardwarePropertiesManager;
Polina Bondarenkoeb845522016-03-01 14:39:48 +010025import android.os.Process;
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070026import android.os.UserHandle;
27import com.android.server.vr.VrManagerInternal;
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010028
29import java.util.Arrays;
30
31/**
32 * Service for {@link HardwarePropertiesManager}
33 */
34public class HardwarePropertiesManagerService extends IHardwarePropertiesManager.Stub {
35
36 private static native void nativeInit();
37
38 private static native float[] nativeGetFanSpeeds();
Polina Bondarenkoeb845522016-03-01 14:39:48 +010039 private static native float[] nativeGetDeviceTemperatures(int type, int source);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010040 private static native CpuUsageInfo[] nativeGetCpuUsages();
41
42 private final Context mContext;
43 private final Object mLock = new Object();
44
45 public HardwarePropertiesManagerService(Context context) {
46 mContext = context;
47 synchronized (mLock) {
48 nativeInit();
49 }
50 }
51
52 @Override
Polina Bondarenkoeb845522016-03-01 14:39:48 +010053 public float[] getDeviceTemperatures(String callingPackage, int type, int source)
54 throws SecurityException {
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010055 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
56 synchronized (mLock) {
Polina Bondarenkoeb845522016-03-01 14:39:48 +010057 return nativeGetDeviceTemperatures(type, source);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010058 }
59 }
60
61 @Override
62 public CpuUsageInfo[] getCpuUsages(String callingPackage) throws SecurityException {
63 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
64 synchronized (mLock) {
65 return nativeGetCpuUsages();
66 }
67 }
68
69 @Override
70 public float[] getFanSpeeds(String callingPackage) throws SecurityException {
71 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
72 synchronized (mLock) {
73 return nativeGetFanSpeeds();
74 }
75 }
76
77 /**
78 * Throws SecurityException if the calling package is not allowed to retrieve information
79 * provided by the service.
80 *
81 * @param callingPackage The calling package name.
82 *
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070083 * @throws SecurityException if something other than the profile or device owner, or the
84 * current VR service tries to retrieve information provided by this service.
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010085 */
86 private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage)
87 throws SecurityException {
88 final PackageManager pm = mContext.getPackageManager();
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070089 int uid = 0;
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010090 try {
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070091 uid = pm.getPackageUid(callingPackage, 0);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010092 if (Binder.getCallingUid() != uid) {
93 throw new SecurityException("The caller has faked the package name.");
94 }
95 } catch (PackageManager.NameNotFoundException e) {
96 throw new SecurityException("The caller has faked the package name.");
97 }
98
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -070099 final int userId = UserHandle.getUserId(uid);
100 final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +0100101 final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
Polina Bondarenkoeb845522016-03-01 14:39:48 +0100102 if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage)
Ruben Brunk8f1d5cb2016-03-22 18:08:41 -0700103 && !vrService.isCurrentVrListener(callingPackage, userId)) {
104 throw new SecurityException("The caller is not a device or profile owner or bound "
105 + "VrListenerService.");
Polina Bondarenkof8754ac2016-02-12 20:38:23 +0100106 }
107 }
108}