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