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

Commit 6034bf5f authored by Guennadi Liakhovetski's avatar Guennadi Liakhovetski Committed by Yin-Chia Yeh
Browse files

CameraService: fix camera removal paths



Currently the camera subsystem is trying to store all cameras, that
have ever been registered with it by camera HALs. This makes it
easier for the framework, but with hotpluggable cameras it makes
little sense, because for this HALs also have to store all cameras,
that have ever been plugged in and with every new plug in event
identify, whether this is a new camera or a known one. An easier and
cleaner approach is to remove cameras upon unplug. This patch
implements that.

Change-Id: Ie38cad59449386351518655e723e3f826a2ec826
Signed-off-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@intel.com>
parent 3d0a566b
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -340,6 +340,9 @@ void CameraManagerGlobal::onStatusChangedLocked(
        msg->setString(kCameraIdKey, AString(cameraId));
        msg->post();
    }
    if (status == hardware::ICameraServiceListener::STATUS_NOT_PRESENT) {
        mDeviceStatusMap.erase(cameraId);
    }
}

} // namespace android
+12 −0
Original line number Diff line number Diff line
@@ -306,6 +306,17 @@ void CameraService::addStates(const String8 id) {
    logDeviceAdded(id, "Device added");
}

void CameraService::removeStates(const String8 id) {
    if (mFlashlight->hasFlashUnit(id)) {
        mTorchStatusMap.removeItem(id);
    }

    {
        Mutex::Autolock lock(mCameraStatesLock);
        mCameraStates.erase(id);
    }
}

void CameraService::onDeviceStatusChanged(const String8& id,
        CameraDeviceStatus newHalStatus) {
    ALOGI("%s: Status changed for cameraId=%s, newStatus=%d", __FUNCTION__,
@@ -370,6 +381,7 @@ void CameraService::onDeviceStatusChanged(const String8& id,
            clientToDisconnect->disconnect();
        }

        removeStates(id);
    } else {
        if (oldStatus == StatusInternal::NOT_PRESENT) {
            logDeviceAdded(id, String8::format("Device status changed from %d to %d", oldStatus,
+2 −1
Original line number Diff line number Diff line
@@ -512,8 +512,9 @@ private:
    // Eumerate all camera providers in the system
    status_t enumerateProviders();

    // Add a new camera to camera and torch state lists
    // Add a new camera to camera and torch state lists or remove an unplugged one
    void addStates(const String8 id);
    void removeStates(const String8 id);

    // Check if we can connect, before we acquire the service lock.
    // The returned originalClientPid is the PID of the original process that wants to connect to
+11 −0
Original line number Diff line number Diff line
@@ -601,6 +601,15 @@ status_t CameraProviderManager::ProviderInfo::addDevice(const std::string& name,
    return OK;
}

void CameraProviderManager::ProviderInfo::removeDevice(std::string id) {
    for (auto it = mDevices.begin(); it != mDevices.end(); it++) {
        if ((*it)->mId == id) {
            mDevices.erase(it);
            break;
        }
    }
}

status_t CameraProviderManager::ProviderInfo::dump(int fd, const Vector<String16>&) const {
    dprintf(fd, "== Camera Provider HAL %s (v2.4, %s) static info: %zu devices: ==\n",
            mProviderName.c_str(), mInterface->isRemote() ? "remote" : "passthrough",
@@ -674,6 +683,8 @@ hardware::Return<void> CameraProviderManager::ProviderInfo::cameraDeviceStatusCh
                return hardware::Void();
            }
            addDevice(cameraDeviceName, newStatus, &id);
        } else if (newStatus == CameraDeviceStatus::NOT_PRESENT) {
            removeDevice(id);
        }
        listener = mManager->getStatusListener();
    }
+2 −0
Original line number Diff line number Diff line
@@ -384,6 +384,8 @@ private:

        // Generate vendor tag id
        static metadata_vendor_id_t generateVendorTagId(const std::string &name);

        void removeDevice(std::string id);
    };

    // Utility to find a DeviceInfo by ID; pointer is only valid while mInterfaceMutex is held