Loading packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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 com.android.systemui.plugins; import com.android.systemui.plugins.annotations.ProvidesInterface; /** * Allows for additional sensors to be retrieved from * {@link com.android.systemui.util.AsyncSensorManager}. */ @ProvidesInterface(action = SensorManagerPlugin.ACTION, version = SensorManagerPlugin.VERSION) public interface SensorManagerPlugin extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_SENSOR_MANAGER"; int VERSION = 1; /** * Registers for trigger events from the sensor. The client will receive trigger events until * {@link #unregisterTriggerEvent(Sensor, TriggerEventListener)} is called. * @param sensor * @param listener */ void registerTriggerEvent(Sensor sensor, TriggerEventListener listener); /** * Unregisters trigger events from the sensor. * @param sensor * @param listener */ void unregisterTriggerEvent(Sensor sensor, TriggerEventListener listener); interface TriggerEventListener { void onTrigger(TriggerEvent event); } class Sensor { public static int TYPE_WAKE_LOCK_SCREEN = 1; int mType; public int getType() { return mType; } public Sensor(int type) { mType = type; } } class TriggerEvent { Sensor mSensor; public TriggerEvent(Sensor sensor) { mSensor = sensor; } } } packages/SystemUI/src/com/android/systemui/Dependency.java +2 −1 Original line number Diff line number Diff line Loading @@ -178,7 +178,8 @@ public class Dependency extends SystemUI { getDependency(ActivityStarter.class)); mProviders.put(AsyncSensorManager.class, () -> new AsyncSensorManager(mContext.getSystemService(SensorManager.class))); new AsyncSensorManager(mContext.getSystemService(SensorManager.class), getDependency(PluginManager.class))); mProviders.put(BluetoothController.class, () -> new BluetoothControllerImpl(mContext, getDependency(BG_LOOPER))); Loading packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java +48 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.util; import android.content.Context; import android.hardware.HardwareBuffer; import android.hardware.Sensor; import android.hardware.SensorAdditionalInfo; Loading @@ -30,7 +31,11 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.shared.plugins.PluginManager; import java.util.ArrayList; import java.util.List; /** Loading @@ -40,7 +45,8 @@ import java.util.List; * without blocking. Note that this means registering listeners now always appears successful even * if it is not. */ public class AsyncSensorManager extends SensorManager { public class AsyncSensorManager extends SensorManager implements PluginListener<SensorManagerPlugin> { private static final String TAG = "AsyncSensorManager"; Loading @@ -48,12 +54,15 @@ public class AsyncSensorManager extends SensorManager { private final List<Sensor> mSensorCache; private final HandlerThread mHandlerThread = new HandlerThread("async_sensor"); @VisibleForTesting final Handler mHandler; private final List<SensorManagerPlugin> mPlugins; public AsyncSensorManager(SensorManager inner) { public AsyncSensorManager(SensorManager inner, PluginManager pluginManager) { mInner = inner; mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); mSensorCache = mInner.getSensorList(Sensor.TYPE_ALL); mPlugins = new ArrayList<>(); pluginManager.addPluginListener(this, SensorManagerPlugin.class, true /* allowMultiple */); } @Override Loading @@ -63,7 +72,7 @@ public class AsyncSensorManager extends SensorManager { @Override protected List<Sensor> getFullDynamicSensorList() { return mInner.getDynamicSensorList(Sensor.TYPE_ALL); return mInner.getSensorList(Sensor.TYPE_ALL); } @Override Loading Loading @@ -132,6 +141,32 @@ public class AsyncSensorManager extends SensorManager { return true; } /** * Requests for all sensors that match the given type from all plugins. * @param sensor * @param listener */ public void requestPluginTriggerSensor(SensorManagerPlugin.Sensor sensor, SensorManagerPlugin.TriggerEventListener listener) { if (mPlugins.isEmpty()) { Log.w(TAG, "No plugins registered"); } mHandler.post(() -> { for (int i = 0; i < mPlugins.size(); i++) { mPlugins.get(i).registerTriggerEvent(sensor, listener); } }); } public void cancelPluginTriggerSensor(SensorManagerPlugin.Sensor sensor, SensorManagerPlugin.TriggerEventListener listener) { mHandler.post(() -> { for (int i = 0; i < mPlugins.size(); i++) { mPlugins.get(i).unregisterTriggerEvent(sensor, listener); } }); } @Override protected boolean initDataInjectionImpl(boolean enable) { throw new UnsupportedOperationException("not implemented"); Loading Loading @@ -159,4 +194,14 @@ public class AsyncSensorManager extends SensorManager { } }); } @Override public void onPluginConnected(SensorManagerPlugin plugin, Context pluginContext) { mPlugins.add(plugin); } @Override public void onPluginDisconnected(SensorManagerPlugin plugin) { mPlugins.remove(plugin); } } packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java +12 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.util; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; Loading @@ -28,6 +29,8 @@ import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.utils.hardware.FakeSensorManager; import org.junit.Before; Loading @@ -42,9 +45,11 @@ public class AsyncSensorManagerTest extends SysuiTestCase { private FakeSensorManager mFakeSensorManager; private SensorEventListener mListener; private FakeSensorManager.MockProximitySensor mSensor; private PluginManager mPluginManager; @Before public void setUp() throws Exception { mPluginManager = mock(PluginManager.class); mFakeSensorManager = new FakeSensorManager(mContext); mAsyncSensorManager = new TestableAsyncSensorManager(mFakeSensorManager); mSensor = mFakeSensorManager.getMockProximitySensor(); Loading Loading @@ -86,9 +91,15 @@ public class AsyncSensorManagerTest extends SysuiTestCase { verifyNoMoreInteractions(mListener); } @Test public void registersPlugin_whenLoaded() { verify(mPluginManager).addPluginListener(eq(mAsyncSensorManager), eq(SensorManagerPlugin.class), eq(true) /* allowMultiple */); } private class TestableAsyncSensorManager extends AsyncSensorManager { public TestableAsyncSensorManager(SensorManager sensorManager) { super(sensorManager); super(sensorManager, mPluginManager); } public void waitUntilRequestsCompleted() { Loading Loading
packages/SystemUI/plugin/src/com/android/systemui/plugins/SensorManagerPlugin.java 0 → 100644 +70 −0 Original line number Diff line number Diff line /* * Copyright (C) 2018 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 com.android.systemui.plugins; import com.android.systemui.plugins.annotations.ProvidesInterface; /** * Allows for additional sensors to be retrieved from * {@link com.android.systemui.util.AsyncSensorManager}. */ @ProvidesInterface(action = SensorManagerPlugin.ACTION, version = SensorManagerPlugin.VERSION) public interface SensorManagerPlugin extends Plugin { String ACTION = "com.android.systemui.action.PLUGIN_SENSOR_MANAGER"; int VERSION = 1; /** * Registers for trigger events from the sensor. The client will receive trigger events until * {@link #unregisterTriggerEvent(Sensor, TriggerEventListener)} is called. * @param sensor * @param listener */ void registerTriggerEvent(Sensor sensor, TriggerEventListener listener); /** * Unregisters trigger events from the sensor. * @param sensor * @param listener */ void unregisterTriggerEvent(Sensor sensor, TriggerEventListener listener); interface TriggerEventListener { void onTrigger(TriggerEvent event); } class Sensor { public static int TYPE_WAKE_LOCK_SCREEN = 1; int mType; public int getType() { return mType; } public Sensor(int type) { mType = type; } } class TriggerEvent { Sensor mSensor; public TriggerEvent(Sensor sensor) { mSensor = sensor; } } }
packages/SystemUI/src/com/android/systemui/Dependency.java +2 −1 Original line number Diff line number Diff line Loading @@ -178,7 +178,8 @@ public class Dependency extends SystemUI { getDependency(ActivityStarter.class)); mProviders.put(AsyncSensorManager.class, () -> new AsyncSensorManager(mContext.getSystemService(SensorManager.class))); new AsyncSensorManager(mContext.getSystemService(SensorManager.class), getDependency(PluginManager.class))); mProviders.put(BluetoothController.class, () -> new BluetoothControllerImpl(mContext, getDependency(BG_LOOPER))); Loading
packages/SystemUI/src/com/android/systemui/util/AsyncSensorManager.java +48 −3 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui.util; import android.content.Context; import android.hardware.HardwareBuffer; import android.hardware.Sensor; import android.hardware.SensorAdditionalInfo; Loading @@ -30,7 +31,11 @@ import android.util.Log; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.shared.plugins.PluginManager; import java.util.ArrayList; import java.util.List; /** Loading @@ -40,7 +45,8 @@ import java.util.List; * without blocking. Note that this means registering listeners now always appears successful even * if it is not. */ public class AsyncSensorManager extends SensorManager { public class AsyncSensorManager extends SensorManager implements PluginListener<SensorManagerPlugin> { private static final String TAG = "AsyncSensorManager"; Loading @@ -48,12 +54,15 @@ public class AsyncSensorManager extends SensorManager { private final List<Sensor> mSensorCache; private final HandlerThread mHandlerThread = new HandlerThread("async_sensor"); @VisibleForTesting final Handler mHandler; private final List<SensorManagerPlugin> mPlugins; public AsyncSensorManager(SensorManager inner) { public AsyncSensorManager(SensorManager inner, PluginManager pluginManager) { mInner = inner; mHandlerThread.start(); mHandler = new Handler(mHandlerThread.getLooper()); mSensorCache = mInner.getSensorList(Sensor.TYPE_ALL); mPlugins = new ArrayList<>(); pluginManager.addPluginListener(this, SensorManagerPlugin.class, true /* allowMultiple */); } @Override Loading @@ -63,7 +72,7 @@ public class AsyncSensorManager extends SensorManager { @Override protected List<Sensor> getFullDynamicSensorList() { return mInner.getDynamicSensorList(Sensor.TYPE_ALL); return mInner.getSensorList(Sensor.TYPE_ALL); } @Override Loading Loading @@ -132,6 +141,32 @@ public class AsyncSensorManager extends SensorManager { return true; } /** * Requests for all sensors that match the given type from all plugins. * @param sensor * @param listener */ public void requestPluginTriggerSensor(SensorManagerPlugin.Sensor sensor, SensorManagerPlugin.TriggerEventListener listener) { if (mPlugins.isEmpty()) { Log.w(TAG, "No plugins registered"); } mHandler.post(() -> { for (int i = 0; i < mPlugins.size(); i++) { mPlugins.get(i).registerTriggerEvent(sensor, listener); } }); } public void cancelPluginTriggerSensor(SensorManagerPlugin.Sensor sensor, SensorManagerPlugin.TriggerEventListener listener) { mHandler.post(() -> { for (int i = 0; i < mPlugins.size(); i++) { mPlugins.get(i).unregisterTriggerEvent(sensor, listener); } }); } @Override protected boolean initDataInjectionImpl(boolean enable) { throw new UnsupportedOperationException("not implemented"); Loading Loading @@ -159,4 +194,14 @@ public class AsyncSensorManager extends SensorManager { } }); } @Override public void onPluginConnected(SensorManagerPlugin plugin, Context pluginContext) { mPlugins.add(plugin); } @Override public void onPluginDisconnected(SensorManagerPlugin plugin) { mPlugins.remove(plugin); } }
packages/SystemUI/tests/src/com/android/systemui/util/AsyncSensorManagerTest.java +12 −1 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.systemui.util; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; Loading @@ -28,6 +29,8 @@ import android.support.test.filters.SmallTest; import android.testing.AndroidTestingRunner; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.SensorManagerPlugin; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.utils.hardware.FakeSensorManager; import org.junit.Before; Loading @@ -42,9 +45,11 @@ public class AsyncSensorManagerTest extends SysuiTestCase { private FakeSensorManager mFakeSensorManager; private SensorEventListener mListener; private FakeSensorManager.MockProximitySensor mSensor; private PluginManager mPluginManager; @Before public void setUp() throws Exception { mPluginManager = mock(PluginManager.class); mFakeSensorManager = new FakeSensorManager(mContext); mAsyncSensorManager = new TestableAsyncSensorManager(mFakeSensorManager); mSensor = mFakeSensorManager.getMockProximitySensor(); Loading Loading @@ -86,9 +91,15 @@ public class AsyncSensorManagerTest extends SysuiTestCase { verifyNoMoreInteractions(mListener); } @Test public void registersPlugin_whenLoaded() { verify(mPluginManager).addPluginListener(eq(mAsyncSensorManager), eq(SensorManagerPlugin.class), eq(true) /* allowMultiple */); } private class TestableAsyncSensorManager extends AsyncSensorManager { public TestableAsyncSensorManager(SensorManager sensorManager) { super(sensorManager); super(sensorManager, mPluginManager); } public void waitUntilRequestsCompleted() { Loading