/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server; import android.app.admin.DevicePolicyManager; import android.content.Context; import android.content.pm.PackageManager; import android.os.Binder; import android.os.CpuUsageInfo; import android.os.IHardwarePropertiesManager; import android.os.Process; import android.os.UserHandle; import com.android.server.vr.VrManagerInternal; import java.util.Arrays; /** * Service for {@link HardwarePropertiesManager} */ public class HardwarePropertiesManagerService extends IHardwarePropertiesManager.Stub { private static native void nativeInit(); private static native float[] nativeGetFanSpeeds(); private static native float[] nativeGetDeviceTemperatures(int type, int source); private static native CpuUsageInfo[] nativeGetCpuUsages(); private final Context mContext; private final Object mLock = new Object(); public HardwarePropertiesManagerService(Context context) { mContext = context; synchronized (mLock) { nativeInit(); } } @Override public float[] getDeviceTemperatures(String callingPackage, int type, int source) throws SecurityException { enforceHardwarePropertiesRetrievalAllowed(callingPackage); synchronized (mLock) { return nativeGetDeviceTemperatures(type, source); } } @Override public CpuUsageInfo[] getCpuUsages(String callingPackage) throws SecurityException { enforceHardwarePropertiesRetrievalAllowed(callingPackage); synchronized (mLock) { return nativeGetCpuUsages(); } } @Override public float[] getFanSpeeds(String callingPackage) throws SecurityException { enforceHardwarePropertiesRetrievalAllowed(callingPackage); synchronized (mLock) { return nativeGetFanSpeeds(); } } /** * Throws SecurityException if the calling package is not allowed to retrieve information * provided by the service. * * @param callingPackage The calling package name. * * @throws SecurityException if something other than the profile or device owner, or the * current VR service tries to retrieve information provided by this service. */ private void enforceHardwarePropertiesRetrievalAllowed(String callingPackage) throws SecurityException { final PackageManager pm = mContext.getPackageManager(); int uid = 0; try { uid = pm.getPackageUid(callingPackage, 0); if (Binder.getCallingUid() != uid) { throw new SecurityException("The caller has faked the package name."); } } catch (PackageManager.NameNotFoundException e) { throw new SecurityException("The caller has faked the package name."); } final int userId = UserHandle.getUserId(uid); final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class); final DevicePolicyManager dpm = mContext.getSystemService(DevicePolicyManager.class); if (!dpm.isDeviceOwnerApp(callingPackage) && !dpm.isProfileOwnerApp(callingPackage) && !vrService.isCurrentVrListener(callingPackage, userId)) { throw new SecurityException("The caller is not a device or profile owner or bound " + "VrListenerService."); } } }