Loading core/java/android/hardware/SensorManager.java +21 −0 Original line number Diff line number Diff line Loading @@ -449,6 +449,27 @@ public abstract class SensorManager { return list; } /** * Returns the {@link Sensor} object identified by the given sensor handle. * * The raw sensor handle integer is an implementation detail and as such this method should only * be used by internal system components. * * @param sensorHandle The integer handle uniquely identifying the sensor. * @return A Sensor object identified by the given {@code sensorHandle}, if such a sensor * exists, {@code null} otherwise. * * @hide */ public @Nullable Sensor getSensorByHandle(int sensorHandle) { for (final Sensor sensor : getFullSensorList()) { if (sensor.getHandle() == sensorHandle) { return sensor; } } return null; } /** * Use this method to get a list of available dynamic sensors of a certain type. * Make multiple calls to get sensors of different types or use Loading core/java/android/hardware/SystemSensorManager.java +6 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,12 @@ public class SystemSensorManager extends SensorManager { return fullList; } /** @hide */ @Override public Sensor getSensorByHandle(int sensorHandle) { return mHandleToSensor.get(sensorHandle); } /** @hide */ @Override protected List<Sensor> getFullDynamicSensorList() { Loading core/java/com/android/internal/app/IBatteryStats.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ interface IBatteryStats { void noteResetCamera(); @EnforcePermission("UPDATE_DEVICE_STATS") void noteResetFlashlight(); void noteWakeupSensorEvent(long elapsedNanos, int uid, int handle); // Remaining methods are only used in Java. @EnforcePermission("BATTERY_STATS") Loading services/core/java/com/android/server/am/BatteryStatsService.java +22 −1 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.hardware.Sensor; import android.hardware.SensorManager; import android.hardware.power.stats.PowerEntity; import android.hardware.power.stats.State; import android.hardware.power.stats.StateResidency; Loading Loading @@ -149,7 +151,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub private final PowerProfile mPowerProfile; final BatteryStatsImpl mStats; @GuardedBy("mWakeupStats") final CpuWakeupStats mCpuWakeupStats; private final BatteryUsageStatsStore mBatteryUsageStatsStore; private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider; Loading Loading @@ -1260,6 +1261,26 @@ public final class BatteryStatsService extends IBatteryStats.Stub null, sensor, FrameworkStatsLog.SENSOR_STATE_CHANGED__STATE__ON); } @Override public void noteWakeupSensorEvent(long elapsedNanos, int uid, int sensorHandle) { final int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { throw new SecurityException("Calling uid " + callingUid + " is not system uid"); } final SensorManager sm = mContext.getSystemService(SensorManager.class); final Sensor sensor = sm.getSensorByHandle(sensorHandle); if (sensor == null) { Slog.w(TAG, "Unknown sensor handle " + sensorHandle + " received in noteWakeupSensorEvent"); return; } Slog.i(TAG, "Sensor " + sensor + " wakeup event at " + elapsedNanos + " sent to uid " + uid); // TODO (b/275436924): Remove log and pipe to CpuWakeupStats for wakeup attribution // This method should return as quickly as possible. Use mHandler#post to do longer work. } @Override @EnforcePermission(UPDATE_DEVICE_STATS) public void noteStopSensor(final int uid, final int sensor) { Loading Loading
core/java/android/hardware/SensorManager.java +21 −0 Original line number Diff line number Diff line Loading @@ -449,6 +449,27 @@ public abstract class SensorManager { return list; } /** * Returns the {@link Sensor} object identified by the given sensor handle. * * The raw sensor handle integer is an implementation detail and as such this method should only * be used by internal system components. * * @param sensorHandle The integer handle uniquely identifying the sensor. * @return A Sensor object identified by the given {@code sensorHandle}, if such a sensor * exists, {@code null} otherwise. * * @hide */ public @Nullable Sensor getSensorByHandle(int sensorHandle) { for (final Sensor sensor : getFullSensorList()) { if (sensor.getHandle() == sensorHandle) { return sensor; } } return null; } /** * Use this method to get a list of available dynamic sensors of a certain type. * Make multiple calls to get sensors of different types or use Loading
core/java/android/hardware/SystemSensorManager.java +6 −0 Original line number Diff line number Diff line Loading @@ -220,6 +220,12 @@ public class SystemSensorManager extends SensorManager { return fullList; } /** @hide */ @Override public Sensor getSensorByHandle(int sensorHandle) { return mHandleToSensor.get(sensorHandle); } /** @hide */ @Override protected List<Sensor> getFullDynamicSensorList() { Loading
core/java/com/android/internal/app/IBatteryStats.aidl +1 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,7 @@ interface IBatteryStats { void noteResetCamera(); @EnforcePermission("UPDATE_DEVICE_STATS") void noteResetFlashlight(); void noteWakeupSensorEvent(long elapsedNanos, int uid, int handle); // Remaining methods are only used in Java. @EnforcePermission("BATTERY_STATS") Loading
services/core/java/com/android/server/am/BatteryStatsService.java +22 −1 Original line number Diff line number Diff line Loading @@ -37,6 +37,8 @@ import android.content.ContentResolver; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.hardware.Sensor; import android.hardware.SensorManager; import android.hardware.power.stats.PowerEntity; import android.hardware.power.stats.State; import android.hardware.power.stats.StateResidency; Loading Loading @@ -149,7 +151,6 @@ public final class BatteryStatsService extends IBatteryStats.Stub private final PowerProfile mPowerProfile; final BatteryStatsImpl mStats; @GuardedBy("mWakeupStats") final CpuWakeupStats mCpuWakeupStats; private final BatteryUsageStatsStore mBatteryUsageStatsStore; private final BatteryStatsImpl.UserInfoProvider mUserManagerUserInfoProvider; Loading Loading @@ -1260,6 +1261,26 @@ public final class BatteryStatsService extends IBatteryStats.Stub null, sensor, FrameworkStatsLog.SENSOR_STATE_CHANGED__STATE__ON); } @Override public void noteWakeupSensorEvent(long elapsedNanos, int uid, int sensorHandle) { final int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { throw new SecurityException("Calling uid " + callingUid + " is not system uid"); } final SensorManager sm = mContext.getSystemService(SensorManager.class); final Sensor sensor = sm.getSensorByHandle(sensorHandle); if (sensor == null) { Slog.w(TAG, "Unknown sensor handle " + sensorHandle + " received in noteWakeupSensorEvent"); return; } Slog.i(TAG, "Sensor " + sensor + " wakeup event at " + elapsedNanos + " sent to uid " + uid); // TODO (b/275436924): Remove log and pipe to CpuWakeupStats for wakeup attribution // This method should return as quickly as possible. Use mHandler#post to do longer work. } @Override @EnforcePermission(UPDATE_DEVICE_STATS) public void noteStopSensor(final int uid, final int sensor) { Loading