Better support for head and screen sensors being the same one

This is not a super interesting use-case, but for completeness we
should make sure it is handled correctly.

From the Sensor Framework standpoint, a sensor can only be enabled
once at a given time. We mirror this behavior in SensorPoseProvider
and document it well.

At the SpatializerPoseController layer we make sure that we don't
enable a sensor more than once and that if both sensors are the same
that we treat an event as applying to both.

Test: manual verification of this mode.
Bug: 188502620
Change-Id: I3aa1f225d7100c5d934af9255484caec75375380
diff --git a/services/audiopolicy/service/SpatializerPoseController.cpp b/services/audiopolicy/service/SpatializerPoseController.cpp
index 7e91d76..3d79c9d 100644
--- a/services/audiopolicy/service/SpatializerPoseController.cpp
+++ b/services/audiopolicy/service/SpatializerPoseController.cpp
@@ -117,25 +117,45 @@
 
 void SpatializerPoseController::setHeadSensor(const ASensor* sensor) {
     std::lock_guard lock(mMutex);
-    // Stop current sensor, if valid.
-    if (mHeadSensor != SensorPoseProvider::INVALID_HANDLE) {
+    // Stop current sensor, if valid and different from the other sensor.
+    if (mHeadSensor != SensorPoseProvider::INVALID_HANDLE && mHeadSensor != mScreenSensor) {
         mPoseProvider->stopSensor(mHeadSensor);
     }
-    // Start new sensor, if valid.
-    mHeadSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
-                                    : SensorPoseProvider::INVALID_HANDLE;
+
+    if (sensor != nullptr) {
+        if (ASensor_getHandle(sensor) != mScreenSensor) {
+            // Start new sensor.
+            mHeadSensor = mPoseProvider->startSensor(sensor, mSensorPeriod);
+        } else {
+            // Sensor is already enabled.
+            mHeadSensor = mScreenSensor;
+        }
+    } else {
+        mHeadSensor = SensorPoseProvider::INVALID_HANDLE;
+    }
+
     mProcessor->recenter(true, false);
 }
 
 void SpatializerPoseController::setScreenSensor(const ASensor* sensor) {
     std::lock_guard lock(mMutex);
-    // Stop current sensor, if valid.
-    if (mScreenSensor != SensorPoseProvider::INVALID_HANDLE) {
+    // Stop current sensor, if valid and different from the other sensor.
+    if (mScreenSensor != SensorPoseProvider::INVALID_HANDLE && mScreenSensor != mHeadSensor) {
         mPoseProvider->stopSensor(mScreenSensor);
     }
-    // Start new sensor, if valid.
-    mScreenSensor = sensor != nullptr ? mPoseProvider->startSensor(sensor, mSensorPeriod)
-                                      : SensorPoseProvider::INVALID_HANDLE;
+
+    if (sensor != nullptr) {
+        if (ASensor_getHandle(sensor) != mHeadSensor) {
+            // Start new sensor.
+            mScreenSensor = mPoseProvider->startSensor(sensor, mSensorPeriod);
+        } else {
+            // Sensor is already enabled.
+            mScreenSensor = mHeadSensor;
+        }
+    } else {
+        mScreenSensor = SensorPoseProvider::INVALID_HANDLE;
+    }
+
     mProcessor->recenter(false, true);
 }
 
@@ -188,7 +208,8 @@
     std::lock_guard lock(mMutex);
     if (sensor == mHeadSensor) {
         mProcessor->setWorldToHeadPose(timestamp, pose, twist.value_or(Twist3f()));
-    } else if (sensor == mScreenSensor) {
+    }
+    if (sensor == mScreenSensor) {
         mProcessor->setWorldToScreenPose(timestamp, pose);
     }
 }