Remove dependency on libandroid

The main purpose of this change is to avoid having to pull in libandroid
for the sake of using the sensor manager from the audioserver process
(native). The way this is achieved is by using lower-level APIs, namely
those offered by libsensor.

As a result, we were able to use sensor handles in SensorPoseProvider,
rather than ASensor* objects, which is simpler and removes the need to
enumerate all the sensor for the sake of finding the one with the
correct handle.

Test: Manually enable head tracking and observe the logs to verify that
      the expected pose updates are received.
Bug: 198795859
Change-Id: Ic69c322d6ea9297309a4856b3047c841831e04d7
diff --git a/services/audiopolicy/service/Android.bp b/services/audiopolicy/service/Android.bp
index 834478f..197f183 100644
--- a/services/audiopolicy/service/Android.bp
+++ b/services/audiopolicy/service/Android.bp
@@ -26,7 +26,6 @@
 
     shared_libs: [
         "libactivitymanager_aidl",
-        "libandroid",
         "libaudioclient",
         "libaudioclient_aidl_conversion",
         "libaudiofoundation",
diff --git a/services/audiopolicy/service/Spatializer.cpp b/services/audiopolicy/service/Spatializer.cpp
index 32499f4..502a8d0 100644
--- a/services/audiopolicy/service/Spatializer.cpp
+++ b/services/audiopolicy/service/Spatializer.cpp
@@ -25,7 +25,6 @@
 #include <sys/types.h>
 
 #include <android/content/AttributionSourceState.h>
-#include <android/sensor.h>
 #include <audio_utils/fixedfft.h>
 #include <cutils/bitops.h>
 #include <hardware/sensors.h>
@@ -346,9 +345,9 @@
 
     modes->push_back(SpatializerHeadTrackingMode::DISABLED);
     if (mSupportsHeadTracking) {
-        if (mHeadSensor != nullptr) {
+        if (mHeadSensor != SpatializerPoseController::INVALID_SENSOR) {
             modes->push_back(SpatializerHeadTrackingMode::RELATIVE_WORLD);
-            if (mScreenSensor != nullptr) {
+            if (mScreenSensor != SpatializerPoseController::INVALID_SENSOR) {
                 modes->push_back(SpatializerHeadTrackingMode::RELATIVE_SCREEN);
             }
         }
@@ -451,11 +450,7 @@
         return binderStatusFromStatusT(INVALID_OPERATION);
     }
     std::lock_guard lock(mLock);
-    if (sensorHandle == ASENSOR_INVALID) {
-        mHeadSensor = nullptr;
-    } else {
-        mHeadSensor = VALUE_OR_RETURN_BINDER_STATUS(getSensorFromHandle(sensorHandle));
-    }
+    mHeadSensor = sensorHandle;
     if (mPoseController != nullptr) {
         mPoseController->setHeadSensor(mHeadSensor);
     }
@@ -468,11 +463,7 @@
         return binderStatusFromStatusT(INVALID_OPERATION);
     }
     std::lock_guard lock(mLock);
-    if (sensorHandle == ASENSOR_INVALID) {
-        mScreenSensor = nullptr;
-    } else {
-        mScreenSensor = VALUE_OR_RETURN_BINDER_STATUS(getSensorFromHandle(sensorHandle));
-    }
+    mScreenSensor = sensorHandle;
     if (mPoseController != nullptr) {
         mPoseController->setScreenSensor(mScreenSensor);
     }
@@ -634,24 +625,6 @@
     }
 }
 
-/* static */
-ConversionResult<ASensorRef> Spatializer::getSensorFromHandle(int handle) {
-    ASensorManager* sensorManager =
-            ASensorManager_getInstanceForPackage("headtracker");
-    if (!sensorManager) {
-        ALOGE("Failed to get a sensor manager");
-        return base::unexpected(NO_INIT);
-    }
-    ASensorList sensorList;
-    int numSensors = ASensorManager_getSensorList(sensorManager, &sensorList);
-    for (int i = 0; i < numSensors; ++i) {
-        if (ASensor_getHandle(sensorList[i]) == handle) {
-            return sensorList[i];
-        }
-    }
-    return base::unexpected(BAD_VALUE);
-}
-
 status_t Spatializer::attachOutput(audio_io_handle_t output) {
     std::shared_ptr<SpatializerPoseController> poseController;
     {
diff --git a/services/audiopolicy/service/Spatializer.h b/services/audiopolicy/service/Spatializer.h
index 136a467..4d77b78 100644
--- a/services/audiopolicy/service/Spatializer.h
+++ b/services/audiopolicy/service/Spatializer.h
@@ -22,7 +22,6 @@
 #include <android/media/SpatializationLevel.h>
 #include <android/media/SpatializationMode.h>
 #include <android/media/SpatializerHeadTrackingMode.h>
-#include <android/sensor.h>
 #include <media/audiohal/EffectHalInterface.h>
 #include <media/stagefright/foundation/ALooper.h>
 #include <media/AudioEffect.h>
@@ -162,9 +161,6 @@
     void onHeadToStagePoseMsg(const std::vector<float>& headToStage);
     void onActualModeChangeMsg(media::HeadTrackingMode mode);
 
-
-    static ConversionResult<ASensorRef> getSensorFromHandle(int handle);
-
     static constexpr int kMaxEffectParamValues = 10;
     /**
      * Get a parameter from spatializer engine by calling the effect HAL command method directly.
@@ -312,10 +308,10 @@
             = media::SpatializerHeadTrackingMode::DISABLED;
 
     /** Selected Head pose sensor */
-    ASensorRef mHeadSensor GUARDED_BY(mLock) = nullptr;
+    int32_t mHeadSensor GUARDED_BY(mLock) = SpatializerPoseController::INVALID_SENSOR;
 
     /** Selected Screen pose sensor */
-    ASensorRef mScreenSensor GUARDED_BY(mLock) = nullptr;
+    int32_t mScreenSensor GUARDED_BY(mLock) = SpatializerPoseController::INVALID_SENSOR;
 
     /** Last display orientation received */
     static constexpr float kDisplayOrientationInvalid = 1000;
diff --git a/services/audiopolicy/service/SpatializerPoseController.cpp b/services/audiopolicy/service/SpatializerPoseController.cpp
index 215f899..eb23298 100644
--- a/services/audiopolicy/service/SpatializerPoseController.cpp
+++ b/services/audiopolicy/service/SpatializerPoseController.cpp
@@ -17,6 +17,7 @@
 
 #define LOG_TAG "SpatializerPoseController"
 //#define LOG_NDEBUG 0
+#include <sensor/Sensor.h>
 #include <utils/Log.h>
 #include <utils/SystemClock.h>
 
@@ -129,45 +130,47 @@
     mThread.join();
 }
 
-void SpatializerPoseController::setHeadSensor(const ASensor* sensor) {
+void SpatializerPoseController::setHeadSensor(int32_t sensor) {
     std::lock_guard lock(mMutex);
     // Stop current sensor, if valid and different from the other sensor.
-    if (mHeadSensor != SensorPoseProvider::INVALID_HANDLE && mHeadSensor != mScreenSensor) {
+    if (mHeadSensor != INVALID_SENSOR && mHeadSensor != mScreenSensor) {
         mPoseProvider->stopSensor(mHeadSensor);
     }
 
-    if (sensor != nullptr) {
-        if (ASensor_getHandle(sensor) != mScreenSensor) {
+    if (sensor != INVALID_SENSOR) {
+        if (sensor != mScreenSensor) {
             // Start new sensor.
-            mHeadSensor = mPoseProvider->startSensor(sensor, mSensorPeriod);
+            mHeadSensor =
+                    mPoseProvider->startSensor(sensor, mSensorPeriod) ? sensor : INVALID_SENSOR;
         } else {
             // Sensor is already enabled.
             mHeadSensor = mScreenSensor;
         }
     } else {
-        mHeadSensor = SensorPoseProvider::INVALID_HANDLE;
+        mHeadSensor = INVALID_SENSOR;
     }
 
     mProcessor->recenter(true, false);
 }
 
-void SpatializerPoseController::setScreenSensor(const ASensor* sensor) {
+void SpatializerPoseController::setScreenSensor(int32_t sensor) {
     std::lock_guard lock(mMutex);
     // Stop current sensor, if valid and different from the other sensor.
-    if (mScreenSensor != SensorPoseProvider::INVALID_HANDLE && mScreenSensor != mHeadSensor) {
+    if (mScreenSensor != INVALID_SENSOR && mScreenSensor != mHeadSensor) {
         mPoseProvider->stopSensor(mScreenSensor);
     }
 
-    if (sensor != nullptr) {
-        if (ASensor_getHandle(sensor) != mHeadSensor) {
+    if (sensor != INVALID_SENSOR) {
+        if (sensor != mHeadSensor) {
             // Start new sensor.
-            mScreenSensor = mPoseProvider->startSensor(sensor, mSensorPeriod);
+            mScreenSensor =
+                    mPoseProvider->startSensor(sensor, mSensorPeriod) ? sensor : INVALID_SENSOR;
         } else {
             // Sensor is already enabled.
             mScreenSensor = mHeadSensor;
         }
     } else {
-        mScreenSensor = SensorPoseProvider::INVALID_HANDLE;
+        mScreenSensor = INVALID_SENSOR;
     }
 
     mProcessor->recenter(false, true);
diff --git a/services/audiopolicy/service/SpatializerPoseController.h b/services/audiopolicy/service/SpatializerPoseController.h
index 12898aa..c579622 100644
--- a/services/audiopolicy/service/SpatializerPoseController.h
+++ b/services/audiopolicy/service/SpatializerPoseController.h
@@ -42,6 +42,8 @@
  */
 class SpatializerPoseController : private media::SensorPoseProvider::Listener {
   public:
+    static constexpr int32_t INVALID_SENSOR = media::SensorPoseProvider::INVALID_HANDLE;
+
     /**
      * Listener interface for getting pose and mode updates.
      * Methods will always be invoked from a designated thread.
@@ -68,15 +70,15 @@
 
     /**
      * Set the sensor that is to be used for head-tracking.
-     * nullptr can be used to disable head-tracking.
+     * INVALID_SENSOR can be used to disable head-tracking.
      */
-    void setHeadSensor(const ASensor* sensor);
+    void setHeadSensor(int32_t sensor);
 
     /**
      * Set the sensor that is to be used for screen-tracking.
-     * nullptr can be used to disable screen-tracking.
+     * INVALID_SENSOR can be used to disable screen-tracking.
      */
-    void setScreenSensor(const ASensor* sensor);
+    void setScreenSensor(int32_t sensor);
 
     /** Sets the desired head-tracking mode. */
     void setDesiredMode(media::HeadTrackingMode mode);