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