Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ac56f746 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

SensorManager Plugin for trigger events

Bug: 111414690
Bug: 111479454

Test: atest AsyncSensorManagerTest

Change-Id: I141d756e9184418d494285ad1a6ce801c00581c0
parent 167aa777
Loading
Loading
Loading
Loading
+70 −0
Original line number Original line 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;
        }
    }
}
+2 −1
Original line number Original line Diff line number Diff line
@@ -178,7 +178,8 @@ public class Dependency extends SystemUI {
                getDependency(ActivityStarter.class));
                getDependency(ActivityStarter.class));


        mProviders.put(AsyncSensorManager.class, () ->
        mProviders.put(AsyncSensorManager.class, () ->
                new AsyncSensorManager(mContext.getSystemService(SensorManager.class)));
                new AsyncSensorManager(mContext.getSystemService(SensorManager.class),
                        getDependency(PluginManager.class)));


        mProviders.put(BluetoothController.class, () ->
        mProviders.put(BluetoothController.class, () ->
                new BluetoothControllerImpl(mContext, getDependency(BG_LOOPER)));
                new BluetoothControllerImpl(mContext, getDependency(BG_LOOPER)));
+48 −3
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package com.android.systemui.util;
package com.android.systemui.util;


import android.content.Context;
import android.hardware.HardwareBuffer;
import android.hardware.HardwareBuffer;
import android.hardware.Sensor;
import android.hardware.Sensor;
import android.hardware.SensorAdditionalInfo;
import android.hardware.SensorAdditionalInfo;
@@ -30,7 +31,11 @@ import android.util.Log;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.Preconditions;
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;
import java.util.List;


/**
/**
@@ -40,7 +45,8 @@ import java.util.List;
 * without blocking. Note that this means registering listeners now always appears successful even
 * without blocking. Note that this means registering listeners now always appears successful even
 * if it is not.
 * if it is not.
 */
 */
public class AsyncSensorManager extends SensorManager {
public class AsyncSensorManager extends SensorManager
        implements PluginListener<SensorManagerPlugin> {


    private static final String TAG = "AsyncSensorManager";
    private static final String TAG = "AsyncSensorManager";


@@ -48,12 +54,15 @@ public class AsyncSensorManager extends SensorManager {
    private final List<Sensor> mSensorCache;
    private final List<Sensor> mSensorCache;
    private final HandlerThread mHandlerThread = new HandlerThread("async_sensor");
    private final HandlerThread mHandlerThread = new HandlerThread("async_sensor");
    @VisibleForTesting final Handler mHandler;
    @VisibleForTesting final Handler mHandler;
    private final List<SensorManagerPlugin> mPlugins;


    public AsyncSensorManager(SensorManager inner) {
    public AsyncSensorManager(SensorManager inner, PluginManager pluginManager) {
        mInner = inner;
        mInner = inner;
        mHandlerThread.start();
        mHandlerThread.start();
        mHandler = new Handler(mHandlerThread.getLooper());
        mHandler = new Handler(mHandlerThread.getLooper());
        mSensorCache = mInner.getSensorList(Sensor.TYPE_ALL);
        mSensorCache = mInner.getSensorList(Sensor.TYPE_ALL);
        mPlugins = new ArrayList<>();
        pluginManager.addPluginListener(this, SensorManagerPlugin.class, true /* allowMultiple */);
    }
    }


    @Override
    @Override
@@ -63,7 +72,7 @@ public class AsyncSensorManager extends SensorManager {


    @Override
    @Override
    protected List<Sensor> getFullDynamicSensorList() {
    protected List<Sensor> getFullDynamicSensorList() {
        return mInner.getDynamicSensorList(Sensor.TYPE_ALL);
        return mInner.getSensorList(Sensor.TYPE_ALL);
    }
    }


    @Override
    @Override
@@ -132,6 +141,32 @@ public class AsyncSensorManager extends SensorManager {
        return true;
        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
    @Override
    protected boolean initDataInjectionImpl(boolean enable) {
    protected boolean initDataInjectionImpl(boolean enable) {
        throw new UnsupportedOperationException("not implemented");
        throw new UnsupportedOperationException("not implemented");
@@ -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);
    }
}
}
+12 −1
Original line number Original line Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.systemui.util;


import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyNoMoreInteractions;
@@ -28,6 +29,8 @@ import android.support.test.filters.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.AndroidTestingRunner;


import com.android.systemui.SysuiTestCase;
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 com.android.systemui.utils.hardware.FakeSensorManager;


import org.junit.Before;
import org.junit.Before;
@@ -42,9 +45,11 @@ public class AsyncSensorManagerTest extends SysuiTestCase {
    private FakeSensorManager mFakeSensorManager;
    private FakeSensorManager mFakeSensorManager;
    private SensorEventListener mListener;
    private SensorEventListener mListener;
    private FakeSensorManager.MockProximitySensor mSensor;
    private FakeSensorManager.MockProximitySensor mSensor;
    private PluginManager mPluginManager;


    @Before
    @Before
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        mPluginManager = mock(PluginManager.class);
        mFakeSensorManager = new FakeSensorManager(mContext);
        mFakeSensorManager = new FakeSensorManager(mContext);
        mAsyncSensorManager = new TestableAsyncSensorManager(mFakeSensorManager);
        mAsyncSensorManager = new TestableAsyncSensorManager(mFakeSensorManager);
        mSensor = mFakeSensorManager.getMockProximitySensor();
        mSensor = mFakeSensorManager.getMockProximitySensor();
@@ -86,9 +91,15 @@ public class AsyncSensorManagerTest extends SysuiTestCase {
        verifyNoMoreInteractions(mListener);
        verifyNoMoreInteractions(mListener);
    }
    }


    @Test
    public void registersPlugin_whenLoaded() {
        verify(mPluginManager).addPluginListener(eq(mAsyncSensorManager),
                eq(SensorManagerPlugin.class), eq(true) /* allowMultiple */);
    }

    private class TestableAsyncSensorManager extends AsyncSensorManager {
    private class TestableAsyncSensorManager extends AsyncSensorManager {
        public TestableAsyncSensorManager(SensorManager sensorManager) {
        public TestableAsyncSensorManager(SensorManager sensorManager) {
            super(sensorManager);
            super(sensorManager, mPluginManager);
        }
        }


        public void waitUntilRequestsCompleted() {
        public void waitUntilRequestsCompleted() {