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

Commit 0f61d8f1 authored by Ruben Brunk's avatar Ruben Brunk
Browse files

Refactor CameraService to handle errors properly.

Bug: 10361136

-Connect calls now return status_t error flags.

Change-Id: Idca453b111e5df31327f6c99ebe853bb2e332b95
parent 75c16dde
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -39,6 +39,9 @@ Camera::Camera(int cameraId)
{
{
}
}


CameraTraits<Camera>::TCamConnectService CameraTraits<Camera>::fnConnectService =
        &ICameraService::connect;

// construct a camera client from an existing camera remote
// construct a camera client from an existing camera remote
sp<Camera> Camera::create(const sp<ICamera>& camera)
sp<Camera> Camera::create(const sp<ICamera>& camera)
{
{
+8 −3
Original line number Original line Diff line number Diff line
@@ -98,14 +98,19 @@ sp<TCam> CameraBase<TCam, TCamTraits>::connect(int cameraId,
    ALOGV("%s: connect", __FUNCTION__);
    ALOGV("%s: connect", __FUNCTION__);
    sp<TCam> c = new TCam(cameraId);
    sp<TCam> c = new TCam(cameraId);
    sp<TCamCallbacks> cl = c;
    sp<TCamCallbacks> cl = c;
    status_t status = NO_ERROR;
    const sp<ICameraService>& cs = getCameraService();
    const sp<ICameraService>& cs = getCameraService();

    if (cs != 0) {
    if (cs != 0) {
        c->mCamera = cs->connect(cl, cameraId, clientPackageName, clientUid);
        TCamConnectService fnConnectService = TCamTraits::fnConnectService;
        status = (cs.get()->*fnConnectService)(cl, cameraId, clientPackageName, clientUid,
                                             /*out*/ c->mCamera);
    }
    }
    if (c->mCamera != 0) {
    if (status == OK && c->mCamera != 0) {
        c->mCamera->asBinder()->linkToDeath(c);
        c->mCamera->asBinder()->linkToDeath(c);
        c->mStatus = NO_ERROR;
        c->mStatus = NO_ERROR;
    } else {
    } else {
        ALOGW("An error occurred while connecting to camera: %d", cameraId);
        c.clear();
        c.clear();
    }
    }
    return c;
    return c;
+60 −21
Original line number Original line Diff line number Diff line
@@ -120,8 +120,10 @@ public:
    }
    }


    // connect to camera service (android.hardware.Camera)
    // connect to camera service (android.hardware.Camera)
    virtual sp<ICamera> connect(const sp<ICameraClient>& cameraClient, int cameraId,
    virtual status_t connect(const sp<ICameraClient>& cameraClient, int cameraId,
                                const String16 &clientPackageName, int clientUid)
                             const String16 &clientPackageName, int clientUid,
                             /*out*/
                             sp<ICamera>& device)
    {
    {
        Parcel data, reply;
        Parcel data, reply;
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
@@ -131,13 +133,19 @@ public:
        data.writeInt32(clientUid);
        data.writeInt32(clientUid);
        remote()->transact(BnCameraService::CONNECT, data, &reply);
        remote()->transact(BnCameraService::CONNECT, data, &reply);


        if (readExceptionCode(reply)) return NULL;
        if (readExceptionCode(reply)) return -EPROTO;
        return interface_cast<ICamera>(reply.readStrongBinder());
        status_t status = reply.readInt32();
        if (reply.readInt32() != 0) {
            device = interface_cast<ICamera>(reply.readStrongBinder());
        }
        return status;
    }
    }


    // connect to camera service (pro client)
    // connect to camera service (pro client)
    virtual sp<IProCameraUser> connect(const sp<IProCameraCallbacks>& cameraCb, int cameraId,
    virtual status_t connectPro(const sp<IProCameraCallbacks>& cameraCb, int cameraId,
                                       const String16 &clientPackageName, int clientUid)
                                const String16 &clientPackageName, int clientUid,
                                /*out*/
                                sp<IProCameraUser>& device)
    {
    {
        Parcel data, reply;
        Parcel data, reply;
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
@@ -147,16 +155,22 @@ public:
        data.writeInt32(clientUid);
        data.writeInt32(clientUid);
        remote()->transact(BnCameraService::CONNECT_PRO, data, &reply);
        remote()->transact(BnCameraService::CONNECT_PRO, data, &reply);


        if (readExceptionCode(reply)) return NULL;
        if (readExceptionCode(reply)) return -EPROTO;
        return interface_cast<IProCameraUser>(reply.readStrongBinder());
        status_t status = reply.readInt32();
        if (reply.readInt32() != 0) {
            device = interface_cast<IProCameraUser>(reply.readStrongBinder());
        }
        return status;
    }
    }


    // connect to camera service (android.hardware.camera2.CameraDevice)
    // connect to camera service (android.hardware.camera2.CameraDevice)
    virtual sp<ICameraDeviceUser> connect(
    virtual status_t connectDevice(
            const sp<ICameraDeviceCallbacks>& cameraCb,
            const sp<ICameraDeviceCallbacks>& cameraCb,
            int cameraId,
            int cameraId,
            const String16& clientPackageName,
            const String16& clientPackageName,
            int clientUid)
            int clientUid,
            /*out*/
            sp<ICameraDeviceUser>& device)
    {
    {
        Parcel data, reply;
        Parcel data, reply;
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
        data.writeInterfaceToken(ICameraService::getInterfaceDescriptor());
@@ -166,8 +180,12 @@ public:
        data.writeInt32(clientUid);
        data.writeInt32(clientUid);
        remote()->transact(BnCameraService::CONNECT_DEVICE, data, &reply);
        remote()->transact(BnCameraService::CONNECT_DEVICE, data, &reply);


        if (readExceptionCode(reply)) return NULL;
        if (readExceptionCode(reply)) return -EPROTO;
        return interface_cast<ICameraDeviceUser>(reply.readStrongBinder());
        status_t status = reply.readInt32();
        if (reply.readInt32() != 0) {
            device = interface_cast<ICameraDeviceUser>(reply.readStrongBinder());
        }
        return status;
    }
    }


    virtual status_t addListener(const sp<ICameraServiceListener>& listener)
    virtual status_t addListener(const sp<ICameraServiceListener>& listener)
@@ -228,10 +246,17 @@ status_t BnCameraService::onTransact(
            int32_t cameraId = data.readInt32();
            int32_t cameraId = data.readInt32();
            const String16 clientName = data.readString16();
            const String16 clientName = data.readString16();
            int32_t clientUid = data.readInt32();
            int32_t clientUid = data.readInt32();
            sp<ICamera> camera = connect(cameraClient, cameraId,
            sp<ICamera> camera;
                    clientName, clientUid);
            status_t status = connect(cameraClient, cameraId,
                    clientName, clientUid, /*out*/ camera);
            reply->writeNoException();
            reply->writeNoException();
            reply->writeInt32(status);
            if (camera != NULL) {
                reply->writeInt32(1);
                reply->writeStrongBinder(camera->asBinder());
                reply->writeStrongBinder(camera->asBinder());
            } else {
                reply->writeInt32(0);
            }
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
        case CONNECT_PRO: {
        case CONNECT_PRO: {
@@ -241,10 +266,17 @@ status_t BnCameraService::onTransact(
            int32_t cameraId = data.readInt32();
            int32_t cameraId = data.readInt32();
            const String16 clientName = data.readString16();
            const String16 clientName = data.readString16();
            int32_t clientUid = data.readInt32();
            int32_t clientUid = data.readInt32();
            sp<IProCameraUser> camera = connect(cameraClient, cameraId,
            sp<IProCameraUser> camera;
                                                clientName, clientUid);
            status_t status = connectPro(cameraClient, cameraId,
                    clientName, clientUid, /*out*/ camera);
            reply->writeNoException();
            reply->writeNoException();
            reply->writeInt32(status);
            if (camera != NULL) {
                reply->writeInt32(1);
                reply->writeStrongBinder(camera->asBinder());
                reply->writeStrongBinder(camera->asBinder());
            } else {
                reply->writeInt32(0);
            }
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
        case CONNECT_DEVICE: {
        case CONNECT_DEVICE: {
@@ -254,10 +286,17 @@ status_t BnCameraService::onTransact(
            int32_t cameraId = data.readInt32();
            int32_t cameraId = data.readInt32();
            const String16 clientName = data.readString16();
            const String16 clientName = data.readString16();
            int32_t clientUid = data.readInt32();
            int32_t clientUid = data.readInt32();
            sp<ICameraDeviceUser> camera = connect(cameraClient, cameraId,
            sp<ICameraDeviceUser> camera;
                                                clientName, clientUid);
            status_t status = connectDevice(cameraClient, cameraId,
                    clientName, clientUid, /*out*/ camera);
            reply->writeNoException();
            reply->writeNoException();
            reply->writeInt32(status);
            if (camera != NULL) {
                reply->writeInt32(1);
                reply->writeStrongBinder(camera->asBinder());
                reply->writeStrongBinder(camera->asBinder());
            } else {
                reply->writeInt32(0);
            }
            return NO_ERROR;
            return NO_ERROR;
        } break;
        } break;
        case ADD_LISTENER: {
        case ADD_LISTENER: {
+3 −1
Original line number Original line Diff line number Diff line
@@ -26,7 +26,6 @@
#include <binder/IMemory.h>
#include <binder/IMemory.h>


#include <camera/ProCamera.h>
#include <camera/ProCamera.h>
#include <camera/ICameraService.h>
#include <camera/IProCameraUser.h>
#include <camera/IProCameraUser.h>
#include <camera/IProCameraCallbacks.h>
#include <camera/IProCameraCallbacks.h>


@@ -47,6 +46,9 @@ ProCamera::ProCamera(int cameraId)
{
{
}
}


CameraTraits<ProCamera>::TCamConnectService CameraTraits<ProCamera>::fnConnectService =
        &ICameraService::connectPro;

ProCamera::~ProCamera()
ProCamera::~ProCamera()
{
{


+6 −0
Original line number Original line Diff line number Diff line
@@ -51,8 +51,14 @@ struct CameraTraits<Camera>
    typedef CameraListener        TCamListener;
    typedef CameraListener        TCamListener;
    typedef ICamera               TCamUser;
    typedef ICamera               TCamUser;
    typedef ICameraClient         TCamCallbacks;
    typedef ICameraClient         TCamCallbacks;
    typedef status_t (ICameraService::*TCamConnectService)(const sp<ICameraClient>&,
                                                           int, const String16&, int,
                                                           /*out*/
                                                           sp<ICamera>&);
    static TCamConnectService     fnConnectService;
};
};



class Camera :
class Camera :
    public CameraBase<Camera>,
    public CameraBase<Camera>,
    public BnCameraClient
    public BnCameraClient
Loading