blob: 575d99e065076eedc510012f6d2f71e28c577823 [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;
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010026
27import java.util.Arrays;
28
29/**
30 * Service for {@link HardwarePropertiesManager}
31 */
32public class HardwarePropertiesManagerService extends IHardwarePropertiesManager.Stub {
33
34 private static native void nativeInit();
35
36 private static native float[] nativeGetFanSpeeds();
Polina Bondarenkoeb845522016-03-01 14:39:48 +010037 private static native float[] nativeGetDeviceTemperatures(int type, int source);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010038 private static native CpuUsageInfo[] nativeGetCpuUsages();
39
40 private final Context mContext;
41 private final Object mLock = new Object();
42
43 public HardwarePropertiesManagerService(Context context) {
44 mContext = context;
45 synchronized (mLock) {
46 nativeInit();
47 }
48 }
49
50 @Override
Polina Bondarenkoeb845522016-03-01 14:39:48 +010051 public float[] getDeviceTemperatures(String callingPackage, int type, int source)
52 throws SecurityException {
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010053 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
54 synchronized (mLock) {
Polina Bondarenkoeb845522016-03-01 14:39:48 +010055 return nativeGetDeviceTemperatures(type, source);
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010056 }
57 }
58
59 @Override
60 public CpuUsageInfo[] getCpuUsages(String callingPackage) throws SecurityException {
61 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
62 synchronized (mLock) {
63 return nativeGetCpuUsages();
64 }
65 }
66
67 @Override
68 public float[] getFanSpeeds(String callingPackage) throws SecurityException {
69 enforceHardwarePropertiesRetrievalAllowed(callingPackage);
70 synchronized (mLock) {
71 return nativeGetFanSpeeds();
72 }
73 }
74
75 /**
76 * Throws SecurityException if the calling package is not allowed to retrieve information
77 * provided by the service.
78 *
79 * @param callingPackage The calling package name.
80 *
Polina Bondarenkoeb845522016-03-01 14:39:48 +010081 * @throws SecurityException if a non profile or device owner or system tries to retrieve
82 * information provided by the service.
Polina Bondarenkof8754ac2016-02-12 20:38:23 +010083 */
84 private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage)
85 throws SecurityException {
86 final PackageManager pm = mContext.getPackageManager();
87 try {
88 final int uid = pm.getPackageUid(callingPackage, 0);
89 if (Binder.getCallingUid() != uid) {
90 throw new SecurityException("The caller has faked the package name.");
91 }
92 } catch (PackageManager.NameNotFoundException e) {
93 throw new SecurityException("The caller has faked the package name.");
94 }
95
96 final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class);
Polina Bondarenkoeb845522016-03-01 14:39:48 +010097 if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage)
98 && Binder.getCallingUid() != Process.SYSTEM_UID) {
99 throw new SecurityException("The caller is not a device or profile owner or system.");
Polina Bondarenkof8754ac2016-02-12 20:38:23 +0100100 }
101 }
102}