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

Commit 8ef2ae92 authored by Kevin Chyn's avatar Kevin Chyn Committed by Android (Google) Code Review
Browse files

Merge "SensorManager Plugin for trigger events"

parents a1d5e0e9 ac56f746
Loading
Loading
Loading
Loading
+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;
        }
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -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)));
+48 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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;

/**
@@ -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";

@@ -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
@@ -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
@@ -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");
@@ -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 Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();
@@ -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() {