/*
 * Copyright (C) 2015 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 android.os;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.SystemService;
import android.content.Context;
import android.hardware.thermal.V1_0.Constants;
import android.util.Log;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

The HardwarePropertiesManager class provides a mechanism of accessing hardware state of a device: CPU, GPU and battery temperatures, CPU usage per core, fan speed, etc.
/** * The HardwarePropertiesManager class provides a mechanism of accessing hardware state of a * device: CPU, GPU and battery temperatures, CPU usage per core, fan speed, etc. */
@SystemService(Context.HARDWARE_PROPERTIES_SERVICE) public class HardwarePropertiesManager { private static final String TAG = HardwarePropertiesManager.class.getSimpleName(); private final IHardwarePropertiesManager mService;
@hide
/** * @hide */
@Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "DEVICE_TEMPERATURE_" }, value = { DEVICE_TEMPERATURE_CPU, DEVICE_TEMPERATURE_GPU, DEVICE_TEMPERATURE_BATTERY, DEVICE_TEMPERATURE_SKIN }) public @interface DeviceTemperatureType {}
@hide
/** * @hide */
@Retention(RetentionPolicy.SOURCE) @IntDef(prefix = { "TEMPERATURE_" }, value = { TEMPERATURE_CURRENT, TEMPERATURE_THROTTLING, TEMPERATURE_SHUTDOWN, TEMPERATURE_THROTTLING_BELOW_VR_MIN }) public @interface TemperatureSource {} /** * Device temperature types. */ // These constants are also defined in android/os/enums.proto. // Any change to the types here or in the thermal hal should be made in the proto as well.
Temperature of CPUs in Celsius.
/** Temperature of CPUs in Celsius. */
public static final int DEVICE_TEMPERATURE_CPU = Constants.TemperatureType.CPU;
Temperature of GPUs in Celsius.
/** Temperature of GPUs in Celsius. */
public static final int DEVICE_TEMPERATURE_GPU = Constants.TemperatureType.GPU;
Temperature of battery in Celsius.
/** Temperature of battery in Celsius. */
public static final int DEVICE_TEMPERATURE_BATTERY = Constants.TemperatureType.BATTERY;
Temperature of device skin in Celsius.
/** Temperature of device skin in Celsius. */
public static final int DEVICE_TEMPERATURE_SKIN = Constants.TemperatureType.SKIN;
Get current temperature.
/** Get current temperature. */
public static final int TEMPERATURE_CURRENT = 0;
Get throttling temperature threshold.
/** Get throttling temperature threshold. */
public static final int TEMPERATURE_THROTTLING = 1;
Get shutdown temperature threshold.
/** Get shutdown temperature threshold. */
public static final int TEMPERATURE_SHUTDOWN = 2;
Get throttling temperature threshold above which minimum clockrates for VR mode will not be met.
/** * Get throttling temperature threshold above which minimum clockrates for VR mode will not be * met. */
public static final int TEMPERATURE_THROTTLING_BELOW_VR_MIN = 3;
Undefined temperature constant.
/** Undefined temperature constant. */
public static final float UNDEFINED_TEMPERATURE = -Float.MAX_VALUE;
Calling app context.
/** Calling app context. */
private final Context mContext;
@hide
/** @hide */
public HardwarePropertiesManager(Context context, IHardwarePropertiesManager service) { mContext = context; mService = service; }
Return an array of device temperatures in Celsius.
Params:
Throws:
  • SecurityException – if something other than the device owner or the current VR service tries to retrieve information provided by this service.
Returns:an array of requested float device temperatures. Temperature equals to UNDEFINED_TEMPERATURE if undefined. Empty if platform doesn't provide the queried temperature.
/** * Return an array of device temperatures in Celsius. * * @param type type of requested device temperature, one of {@link #DEVICE_TEMPERATURE_CPU}, * {@link #DEVICE_TEMPERATURE_GPU}, {@link #DEVICE_TEMPERATURE_BATTERY} or {@link * #DEVICE_TEMPERATURE_SKIN}. * @param source source of requested device temperature, one of {@link #TEMPERATURE_CURRENT}, * {@link #TEMPERATURE_THROTTLING}, {@link #TEMPERATURE_THROTTLING_BELOW_VR_MIN} or * {@link #TEMPERATURE_SHUTDOWN}. * @return an array of requested float device temperatures. Temperature equals to * {@link #UNDEFINED_TEMPERATURE} if undefined. * Empty if platform doesn't provide the queried temperature. * * @throws SecurityException if something other than the device owner or the current VR service * tries to retrieve information provided by this service. */
public @NonNull float[] getDeviceTemperatures(@DeviceTemperatureType int type, @TemperatureSource int source) { switch (type) { case DEVICE_TEMPERATURE_CPU: case DEVICE_TEMPERATURE_GPU: case DEVICE_TEMPERATURE_BATTERY: case DEVICE_TEMPERATURE_SKIN: switch (source) { case TEMPERATURE_CURRENT: case TEMPERATURE_THROTTLING: case TEMPERATURE_SHUTDOWN: case TEMPERATURE_THROTTLING_BELOW_VR_MIN: try { return mService.getDeviceTemperatures(mContext.getOpPackageName(), type, source); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } default: Log.w(TAG, "Unknown device temperature source."); return new float[0]; } default: Log.w(TAG, "Unknown device temperature type."); return new float[0]; } }
Return an array of CPU usage info for each core.
Throws:
  • SecurityException – if something other than the device owner or the current VR service tries to retrieve information provided by this service.
Returns:an array of CpuUsageInfo for each core. Return null for each unplugged core. Empty if CPU usage is not supported on this system.
/** * Return an array of CPU usage info for each core. * * @return an array of {@link android.os.CpuUsageInfo} for each core. Return {@code null} for * each unplugged core. * Empty if CPU usage is not supported on this system. * * @throws SecurityException if something other than the device owner or the current VR service * tries to retrieve information provided by this service. */
public @NonNull CpuUsageInfo[] getCpuUsages() { try { return mService.getCpuUsages(mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } }
Return an array of fan speeds in RPM.
Throws:
  • SecurityException – if something other than the device owner or the current VR service tries to retrieve information provided by this service.
Returns:an array of float fan speeds in RPM. Empty if there are no fans or fan speed is not supported on this system.
/** * Return an array of fan speeds in RPM. * * @return an array of float fan speeds in RPM. Empty if there are no fans or fan speed is not * supported on this system. * * @throws SecurityException if something other than the device owner or the current VR service * tries to retrieve information provided by this service. */
public @NonNull float[] getFanSpeeds() { try { return mService.getFanSpeeds(mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } }