package org.robolectric.shadows; import android.hardware.*; import android.os.MemoryFile; import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.annotation.RealObject; import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers.ClassParameter; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import static android.os.Build.VERSION_CODES.O; @Implements(SensorManager.class) public class ShadowSensorManager { public boolean forceListenersToFail = false; private final Map<Integer, Sensor> sensorMap = new HashMap<>(); private final ArrayList<SensorEventListener> listeners = new ArrayList<>(); @RealObject private SensorManager realObject; /** * Provide a Sensor for the indicated sensor type. * @param sensorType from Sensor constants * @param sensor Sensor instance */ public void addSensor(int sensorType, Sensor sensor) { sensorMap.put(sensorType, sensor); } @Implementation public Sensor getDefaultSensor(int type) { return sensorMap.get(type); } @Implementation public boolean registerListener(SensorEventListener listener, Sensor sensor, int rate) { if (forceListenersToFail) { return false; } if (!listeners.contains(listener)) { listeners.add(listener); } return true; } @Implementation public void unregisterListener(SensorEventListener listener, Sensor sensor) { listeners.remove(listener); } @Implementation public void unregisterListener(SensorEventListener listener) { listeners.remove(listener); } public boolean hasListener(SensorEventListener listener) { return listeners.contains(listener); } public SensorEvent createSensorEvent() { return ReflectionHelpers.callConstructor(SensorEvent.class); } @Implementation(minSdk = O) public SensorDirectChannel createDirectChannel(MemoryFile mem) { return ReflectionHelpers.callConstructor(SensorDirectChannel.class, ClassParameter.from(SensorManager.class, realObject), ClassParameter.from(int.class, 0), ClassParameter.from(int.class, SensorDirectChannel.TYPE_ASHMEM), ClassParameter.from(long.class, mem.length())); } }