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

Commit 74fca04e authored by Austin Borger's avatar Austin Borger
Browse files

libcameraservice: Refactor the CameraServiceProxyWrapper into a class.

This is necessary for writing a unit test for camera permissions that
checks behavior when the device policy manager has disabled the camera.
Using the true DevicePolicyManager service would require a test be run
while the device has a work profile - a much simpler method would be to
fake the results from CameraServiceProxyWrapper::isCameraDisabled with
an override.

The CameraServiceProxyWrapper is now managed by a shared_ptr that
originates in CameraService, unless this is overridden by an outside
source (cameraservice_test). As a consequence of this, some refactoring
has been done to CameraSessionStatsWrapper class to avoid circular
ownership between it and its parent (CameraServiceProxyWrapper).

Change-Id: Iad4ee87f5c5ab849eee65b72f46f77faf37f4d25
Test: CtsCameraTestCases
parent 504cdd71
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -142,7 +142,10 @@ const String16 CameraService::kWatchAllClientsFlag("all");
// Set to keep track of logged service error events.
static std::set<String8> sServiceErrorEventSet;

CameraService::CameraService() :
CameraService::CameraService(
        std::shared_ptr<CameraServiceProxyWrapper> cameraServiceProxyWrapper) :
        mCameraServiceProxyWrapper(cameraServiceProxyWrapper == nullptr ?
                std::make_shared<CameraServiceProxyWrapper>() : cameraServiceProxyWrapper),
        mEventLog(DEFAULT_EVENT_LOG_LENGTH),
        mNumberOfCameras(0),
        mNumberOfCamerasWithoutSystemCamera(0),
@@ -195,7 +198,7 @@ void CameraService::onFirstRef()

    // This needs to be last call in this function, so that it's as close to
    // ServiceManager::addService() as possible.
    CameraServiceProxyWrapper::pingCameraServiceProxy();
    mCameraServiceProxyWrapper->pingCameraServiceProxy();
    ALOGI("CameraService pinged cameraservice proxy");
}

@@ -983,15 +986,16 @@ Status CameraService::makeClient(const sp<CameraService>& cameraService,
    }
    if (effectiveApiLevel == API_1) { // Camera1 API route
        sp<ICameraClient> tmp = static_cast<ICameraClient*>(cameraCb.get());
        *client = new Camera2Client(cameraService, tmp, packageName, featureId,
                cameraId, api1CameraId, facing, sensorOrientation, clientPid, clientUid,
                servicePid, overrideForPerfClass);
        *client = new Camera2Client(cameraService, tmp, cameraService->mCameraServiceProxyWrapper,
                packageName, featureId, cameraId, api1CameraId, facing, sensorOrientation,
                clientPid, clientUid, servicePid, overrideForPerfClass);
    } else { // Camera2 API route
        sp<hardware::camera2::ICameraDeviceCallbacks> tmp =
                static_cast<hardware::camera2::ICameraDeviceCallbacks*>(cameraCb.get());
        *client = new CameraDeviceClient(cameraService, tmp, packageName,
                systemNativeClient, featureId, cameraId, facing, sensorOrientation,
                clientPid, clientUid, servicePid, overrideForPerfClass);
        *client = new CameraDeviceClient(cameraService, tmp,
                cameraService->mCameraServiceProxyWrapper, packageName, systemNativeClient,
                featureId, cameraId, facing, sensorOrientation, clientPid, clientUid, servicePid,
                overrideForPerfClass);
    }
    return Status::ok();
}
@@ -1708,7 +1712,7 @@ Status CameraService::connectDevice(
        return STATUS_ERROR(ERROR_ILLEGAL_ARGUMENT, msg.string());
    }

    if (CameraServiceProxyWrapper::isCameraDisabled()) {
    if (mCameraServiceProxyWrapper->isCameraDisabled()) {
        String8 msg =
                String8::format("Camera disabled by device policy");
        ALOGE("%s: %s", __FUNCTION__, msg.string());
@@ -1919,7 +1923,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&
            client->setRotateAndCropOverride(mOverrideRotateAndCropMode);
        } else {
          client->setRotateAndCropOverride(
              CameraServiceProxyWrapper::getRotateAndCropOverride(
              mCameraServiceProxyWrapper->getRotateAndCropOverride(
                  clientPackageName, facing, multiuser_get_user_id(clientUid)));
        }

@@ -1969,7 +1973,7 @@ Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const String8&
    device = client;

    int32_t openLatencyMs = ns2ms(systemTime() - openTimeNs);
    CameraServiceProxyWrapper::logOpen(cameraId, facing, clientPackageName,
    mCameraServiceProxyWrapper->logOpen(cameraId, facing, clientPackageName,
            effectiveApiLevel, isNonSystemNdk, openLatencyMs);

    {
@@ -2455,7 +2459,7 @@ Status CameraService::notifyDisplayConfigurationChange() {
            const auto basicClient = current->getValue();
            if (basicClient.get() != nullptr) {
              basicClient->setRotateAndCropOverride(
                  CameraServiceProxyWrapper::getRotateAndCropOverride(
                  mCameraServiceProxyWrapper->getRotateAndCropOverride(
                      basicClient->getPackageName(),
                      basicClient->getCameraFacing(),
                      multiuser_get_user_id(basicClient->getClientUid())));
+7 −1
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@
#include "utils/AutoConditionLock.h"
#include "utils/ClientManager.h"
#include "utils/IPCTransport.h"
#include "utils/CameraServiceProxyWrapper.h"

#include <set>
#include <string>
@@ -100,7 +101,10 @@ public:
    // Implementation of BinderService<T>
    static char const* getServiceName() { return "media.camera"; }

                        CameraService();
                        // Non-null arguments for cameraServiceProxyWrapper should be provided for
                        // testing purposes only.
                        CameraService(std::shared_ptr<CameraServiceProxyWrapper>
                                cameraServiceProxyWrapper = nullptr);
    virtual             ~CameraService();

    /////////////////////////////////////////////////////////////////////
@@ -772,6 +776,8 @@ private:

    sp<SensorPrivacyPolicy> mSensorPrivacyPolicy;

    std::shared_ptr<CameraServiceProxyWrapper> mCameraServiceProxyWrapper;

    // Delay-load the Camera HAL module
    virtual void onFirstRef();

+3 −2
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ using namespace camera2;

Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
        const sp<hardware::ICameraClient>& cameraClient,
        std::shared_ptr<CameraServiceProxyWrapper> cameraServiceProxyWrapper,
        const String16& clientPackageName,
        const std::optional<String16>& clientFeatureId,
        const String8& cameraDeviceId,
@@ -62,7 +63,7 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
        uid_t clientUid,
        int servicePid,
        bool overrideForPerfClass):
        Camera2ClientBase(cameraService, cameraClient, clientPackageName,
        Camera2ClientBase(cameraService, cameraClient, cameraServiceProxyWrapper, clientPackageName,
                false/*systemNativeClient - since no ndk for api1*/, clientFeatureId,
                cameraDeviceId, api1CameraId, cameraFacing, sensorOrientation, clientPid,
                clientUid, servicePid, overrideForPerfClass, /*legacyClient*/ true),
@@ -478,7 +479,7 @@ binder::Status Camera2Client::disconnect() {
    CameraService::Client::disconnect();

    int32_t closeLatencyMs = ns2ms(systemTime() - startTime);
    CameraServiceProxyWrapper::logClose(mCameraIdStr, closeLatencyMs);
    mCameraServiceProxyWrapper->logClose(mCameraIdStr, closeLatencyMs);

    return res;
}
+1 −0
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ public:

    Camera2Client(const sp<CameraService>& cameraService,
            const sp<hardware::ICameraClient>& cameraClient,
            std::shared_ptr<CameraServiceProxyWrapper> cameraServiceProxyWrapper,
            const String16& clientPackageName,
            const std::optional<String16>& clientFeatureId,
            const String8& cameraDeviceId,
+6 −6
Original line number Diff line number Diff line
@@ -31,7 +31,6 @@
#include "device3/Camera3Device.h"
#include "device3/Camera3OutputStream.h"
#include "api2/CameraDeviceClient.h"
#include "utils/CameraServiceProxyWrapper.h"

#include <camera_metadata_hidden.h>

@@ -87,6 +86,7 @@ CameraDeviceClientBase::CameraDeviceClientBase(

CameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
        const sp<hardware::camera2::ICameraDeviceCallbacks>& remoteCallback,
        std::shared_ptr<CameraServiceProxyWrapper> cameraServiceProxyWrapper,
        const String16& clientPackageName,
        bool systemNativeClient,
        const std::optional<String16>& clientFeatureId,
@@ -97,9 +97,9 @@ CameraDeviceClient::CameraDeviceClient(const sp<CameraService>& cameraService,
        uid_t clientUid,
        int servicePid,
        bool overrideForPerfClass) :
    Camera2ClientBase(cameraService, remoteCallback, clientPackageName, systemNativeClient,
                clientFeatureId, cameraId, /*API1 camera ID*/ -1, cameraFacing, sensorOrientation,
                clientPid, clientUid, servicePid, overrideForPerfClass),
    Camera2ClientBase(cameraService, remoteCallback, cameraServiceProxyWrapper, clientPackageName,
            systemNativeClient, clientFeatureId, cameraId, /*API1 camera ID*/ -1, cameraFacing,
            sensorOrientation, clientPid, clientUid, servicePid, overrideForPerfClass),
    mInputStream(),
    mStreamingRequestId(REQUEST_ID_NONE),
    mRequestIdCounter(0),
@@ -692,7 +692,7 @@ binder::Status CameraDeviceClient::endConfigure(int operatingMode,

        nsecs_t configureEnd = systemTime();
        int32_t configureDurationMs = ns2ms(configureEnd) - startTimeMs;
        CameraServiceProxyWrapper::logStreamConfigured(mCameraIdStr, operatingMode,
        mCameraServiceProxyWrapper->logStreamConfigured(mCameraIdStr, operatingMode,
                false /*internalReconfig*/, configureDurationMs);
    }

@@ -2061,7 +2061,7 @@ void CameraDeviceClient::detachDevice() {
    Camera2ClientBase::detachDevice();

    int32_t closeLatencyMs = ns2ms(systemTime() - startTime);
    CameraServiceProxyWrapper::logClose(mCameraIdStr, closeLatencyMs);
    mCameraServiceProxyWrapper->logClose(mCameraIdStr, closeLatencyMs);
}

/** Device-related methods */
Loading