HardwarePropertiesManagerService.java revision f8754ac2127f8adf40bd4731f39b16340acdb2f7
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 19f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.app.admin.DevicePolicyManager; 20f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.content.Context; 21f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.content.pm.PackageManager; 22f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.os.Binder; 23f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.os.CpuUsageInfo; 24f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport android.os.IHardwarePropertiesManager; 25f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 26f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkoimport java.util.Arrays; 27f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 28f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko/** 29f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * Service for {@link HardwarePropertiesManager} 30f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko */ 31f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenkopublic class HardwarePropertiesManagerService extends IHardwarePropertiesManager.Stub { 32f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 33f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko private static native void nativeInit(); 34f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 35f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko private static native float[] nativeGetFanSpeeds(); 36f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko private static native float[] nativeGetDeviceTemperatures(int type); 37f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko private static native CpuUsageInfo[] nativeGetCpuUsages(); 38f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 39f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko private final Context mContext; 40f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko private final Object mLock = new Object(); 41f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 42f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko public HardwarePropertiesManagerService(Context context) { 43f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko mContext = context; 44f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko synchronized (mLock) { 45f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko nativeInit(); 46f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 47f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 48f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 49f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko @Override 50f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko public float[] getDeviceTemperatures(String callingPackage, int type) throws SecurityException { 51f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko enforceHardwarePropertiesRetrievalAllowed(callingPackage); 52f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko synchronized (mLock) { 53f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko return nativeGetDeviceTemperatures(type); 54f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 55f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 56f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 57f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko @Override 58f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko public CpuUsageInfo[] getCpuUsages(String callingPackage) throws SecurityException { 59f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko enforceHardwarePropertiesRetrievalAllowed(callingPackage); 60f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko synchronized (mLock) { 61f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko return nativeGetCpuUsages(); 62f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 63f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 64f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 65f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko @Override 66f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko public float[] getFanSpeeds(String callingPackage) throws SecurityException { 67f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko enforceHardwarePropertiesRetrievalAllowed(callingPackage); 68f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko synchronized (mLock) { 69f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko return nativeGetFanSpeeds(); 70f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 71f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 72f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 73f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko /** 74f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * Throws SecurityException if the calling package is not allowed to retrieve information 75f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * provided by the service. 76f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * 77f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * @param callingPackage The calling package name. 78f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * 79f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * @throws SecurityException if a non profile or device owner tries to retrieve information 80f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko * provided by the service. 81f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko */ 82f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage) 83f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko throws SecurityException { 84f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko final PackageManager pm = mContext.getPackageManager(); 85f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko try { 86f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko final int uid = pm.getPackageUid(callingPackage, 0); 87f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko if (Binder.getCallingUid() != uid) { 88f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko throw new SecurityException("The caller has faked the package name."); 89f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 90f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } catch (PackageManager.NameNotFoundException e) { 91f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko throw new SecurityException("The caller has faked the package name."); 92f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 93f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko 94f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); 95f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage)) { 96f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko throw new SecurityException("The caller is not a device or profile owner."); 97f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 98f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko } 99f8754ac2127f8adf40bd4731f39b16340acdb2f7Polina Bondarenko} 100