186 lines
6.9 KiB
Java
186 lines
6.9 KiB
Java
/*
|
|
* 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.
|
|
*/
|
|
@SystemService(Context.HARDWARE_PROPERTIES_SERVICE)
|
|
public class HardwarePropertiesManager {
|
|
|
|
private static final String TAG = HardwarePropertiesManager.class.getSimpleName();
|
|
|
|
private final IHardwarePropertiesManager mService;
|
|
|
|
/**
|
|
* @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
|
|
*/
|
|
@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. */
|
|
public static final int DEVICE_TEMPERATURE_CPU = Constants.TemperatureType.CPU;
|
|
|
|
/** Temperature of GPUs in Celsius. */
|
|
public static final int DEVICE_TEMPERATURE_GPU = Constants.TemperatureType.GPU;
|
|
|
|
/** Temperature of battery in Celsius. */
|
|
public static final int DEVICE_TEMPERATURE_BATTERY = Constants.TemperatureType.BATTERY;
|
|
|
|
/** Temperature of device skin in Celsius. */
|
|
public static final int DEVICE_TEMPERATURE_SKIN = Constants.TemperatureType.SKIN;
|
|
|
|
/** Get current temperature. */
|
|
public static final int TEMPERATURE_CURRENT = 0;
|
|
|
|
/** Get throttling temperature threshold. */
|
|
public static final int TEMPERATURE_THROTTLING = 1;
|
|
|
|
/** 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.
|
|
*/
|
|
public static final int TEMPERATURE_THROTTLING_BELOW_VR_MIN = 3;
|
|
|
|
/** Undefined temperature constant. */
|
|
public static final float UNDEFINED_TEMPERATURE = -Float.MAX_VALUE;
|
|
|
|
/** Calling app context. */
|
|
private final Context mContext;
|
|
|
|
/** @hide */
|
|
public HardwarePropertiesManager(Context context, IHardwarePropertiesManager service) {
|
|
mContext = context;
|
|
mService = service;
|
|
}
|
|
|
|
/**
|
|
* 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.
|
|
*
|
|
* @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.
|
|
*
|
|
* @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();
|
|
}
|
|
}
|
|
}
|