From 03f5575dc5c1a4de41dd2f327e59c1938b2a25d1 Mon Sep 17 00:00:00 2001 From: Yin-Chia Yeh Date: Wed, 14 Mar 2018 15:28:02 -0700 Subject: [PATCH] Camera: sort NDK getCameraIdList output Bug: 72261912 Change-Id: Iae9873459884c9d3f61dbd21e4e705b59f5f9d2d --- camera/ndk/impl/ACameraManager.cpp | 2 +- camera/ndk/impl/ACameraManager.h | 24 +++++++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/camera/ndk/impl/ACameraManager.cpp b/camera/ndk/impl/ACameraManager.cpp index a1a8cd6d1b..c59d0e7cf6 100644 --- a/camera/ndk/impl/ACameraManager.cpp +++ b/camera/ndk/impl/ACameraManager.cpp @@ -221,7 +221,7 @@ void CameraManagerGlobal::unregisterAvailabilityCallback( mCallbacks.erase(cb); } -void CameraManagerGlobal::getCameraIdList(std::vector *cameraIds) { +void CameraManagerGlobal::getCameraIdList(std::vector* cameraIds) { // Ensure that we have initialized/refreshed the list of available devices auto cs = getCameraService(); Mutex::Autolock _l(mLock); diff --git a/camera/ndk/impl/ACameraManager.h b/camera/ndk/impl/ACameraManager.h index 4a172f38e5..cc42f77c2c 100644 --- a/camera/ndk/impl/ACameraManager.h +++ b/camera/ndk/impl/ACameraManager.h @@ -19,6 +19,7 @@ #include +#include #include #include #include @@ -140,8 +141,29 @@ class CameraManagerGlobal final : public RefBase { static bool validStatus(int32_t status); static bool isStatusAvailable(int32_t status); + // The sort logic must match the logic in + // libcameraservice/common/CameraProviderManager.cpp::getAPI1CompatibleCameraDeviceIds + struct CameraIdComparator { + bool operator()(const String8& a, const String8& b) const { + uint32_t aUint = 0, bUint = 0; + bool aIsUint = base::ParseUint(a.c_str(), &aUint); + bool bIsUint = base::ParseUint(b.c_str(), &bUint); + + // Uint device IDs first + if (aIsUint && bIsUint) { + return aUint < bUint; + } else if (aIsUint) { + return true; + } else if (bIsUint) { + return false; + } + // Simple string compare if both id are not uint + return a < b; + } + }; + // Map camera_id -> status - std::map mDeviceStatusMap; + std::map mDeviceStatusMap; // For the singleton instance static Mutex sLock;