1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_SERVERS_CAMERA_CAMERASERVICE_H 18 #define ANDROID_SERVERS_CAMERA_CAMERASERVICE_H 19 20 #include <android/hardware/BnCameraService.h> 21 #include <android/hardware/ICameraServiceListener.h> 22 #include <android/hardware/ICameraServiceProxy.h> 23 24 #include <cutils/multiuser.h> 25 #include <utils/Vector.h> 26 #include <utils/KeyedVector.h> 27 #include <binder/AppOpsManager.h> 28 #include <binder/BinderService.h> 29 #include <binder/IAppOpsCallback.h> 30 #include <binder/IUidObserver.h> 31 #include <hardware/camera.h> 32 33 #include <android/hardware/camera/common/1.0/types.h> 34 35 #include <camera/VendorTagDescriptor.h> 36 #include <camera/CaptureResult.h> 37 #include <camera/CameraParameters.h> 38 39 #include "CameraFlashlight.h" 40 41 #include "common/CameraProviderManager.h" 42 #include "media/RingBuffer.h" 43 #include "utils/AutoConditionLock.h" 44 #include "utils/ClientManager.h" 45 46 #include <set> 47 #include <string> 48 #include <map> 49 #include <memory> 50 #include <utility> 51 #include <unordered_map> 52 #include <unordered_set> 53 54 namespace android { 55 56 extern volatile int32_t gLogLevel; 57 58 class MemoryHeapBase; 59 class MediaPlayer; 60 61 class CameraService : 62 public BinderService<CameraService>, 63 public virtual ::android::hardware::BnCameraService, 64 public virtual IBinder::DeathRecipient, 65 public virtual CameraProviderManager::StatusListener 66 { 67 friend class BinderService<CameraService>; 68 friend class CameraClient; 69 public: 70 class Client; 71 class BasicClient; 72 73 // The effective API level. The Camera2 API running in LEGACY mode counts as API_1. 74 enum apiLevel { 75 API_1 = 1, 76 API_2 = 2 77 }; 78 79 // 3 second busy timeout when other clients are connecting 80 static const nsecs_t DEFAULT_CONNECT_TIMEOUT_NS = 3000000000; 81 82 // 1 second busy timeout when other clients are disconnecting 83 static const nsecs_t DEFAULT_DISCONNECT_TIMEOUT_NS = 1000000000; 84 85 // Default number of messages to store in eviction log 86 static const size_t DEFAULT_EVENT_LOG_LENGTH = 100; 87 88 // Event log ID 89 static const int SN_EVENT_LOG_ID = 0x534e4554; 90 91 // Implementation of BinderService<T> 92 static char const* getServiceName() { return "media.camera"; } 93 94 CameraService(); 95 virtual ~CameraService(); 96 97 ///////////////////////////////////////////////////////////////////// 98 // HAL Callbacks - implements CameraProviderManager::StatusListener 99 100 virtual void onDeviceStatusChanged(const String8 &cameraId, 101 hardware::camera::common::V1_0::CameraDeviceStatus newHalStatus) override; 102 virtual void onTorchStatusChanged(const String8& cameraId, 103 hardware::camera::common::V1_0::TorchModeStatus newStatus) override; 104 virtual void onNewProviderRegistered() override; 105 106 ///////////////////////////////////////////////////////////////////// 107 // ICameraService 108 virtual binder::Status getNumberOfCameras(int32_t type, int32_t* numCameras); 109 110 virtual binder::Status getCameraInfo(int cameraId, 111 hardware::CameraInfo* cameraInfo); 112 virtual binder::Status getCameraCharacteristics(const String16& cameraId, 113 CameraMetadata* cameraInfo); 114 virtual binder::Status getCameraVendorTagDescriptor( 115 /*out*/ 116 hardware::camera2::params::VendorTagDescriptor* desc); 117 virtual binder::Status getCameraVendorTagCache( 118 /*out*/ 119 hardware::camera2::params::VendorTagDescriptorCache* cache); 120 121 virtual binder::Status connect(const sp<hardware::ICameraClient>& cameraClient, 122 int32_t cameraId, const String16& clientPackageName, 123 int32_t clientUid, int clientPid, 124 /*out*/ 125 sp<hardware::ICamera>* device); 126 127 virtual binder::Status connectLegacy(const sp<hardware::ICameraClient>& cameraClient, 128 int32_t cameraId, int32_t halVersion, 129 const String16& clientPackageName, int32_t clientUid, 130 /*out*/ 131 sp<hardware::ICamera>* device); 132 133 virtual binder::Status connectDevice( 134 const sp<hardware::camera2::ICameraDeviceCallbacks>& cameraCb, const String16& cameraId, 135 const String16& clientPackageName, int32_t clientUid, 136 /*out*/ 137 sp<hardware::camera2::ICameraDeviceUser>* device); 138 139 virtual binder::Status addListener(const sp<hardware::ICameraServiceListener>& listener, 140 /*out*/ 141 std::vector<hardware::CameraStatus>* cameraStatuses); 142 virtual binder::Status removeListener( 143 const sp<hardware::ICameraServiceListener>& listener); 144 145 virtual binder::Status getLegacyParameters( 146 int32_t cameraId, 147 /*out*/ 148 String16* parameters); 149 150 virtual binder::Status setTorchMode(const String16& cameraId, bool enabled, 151 const sp<IBinder>& clientBinder); 152 153 virtual binder::Status notifySystemEvent(int32_t eventId, 154 const std::vector<int32_t>& args); 155 156 // OK = supports api of that version, -EOPNOTSUPP = does not support 157 virtual binder::Status supportsCameraApi( 158 const String16& cameraId, int32_t apiVersion, 159 /*out*/ 160 bool *isSupported); 161 162 // Extra permissions checks 163 virtual status_t onTransact(uint32_t code, const Parcel& data, 164 Parcel* reply, uint32_t flags); 165 166 virtual status_t dump(int fd, const Vector<String16>& args); 167 168 virtual status_t shellCommand(int in, int out, int err, const Vector<String16>& args); 169 170 ///////////////////////////////////////////////////////////////////// 171 // Client functionality 172 173 enum sound_kind { 174 SOUND_SHUTTER = 0, 175 SOUND_RECORDING_START = 1, 176 SOUND_RECORDING_STOP = 2, 177 NUM_SOUNDS 178 }; 179 180 void loadSound(); 181 void playSound(sound_kind kind); 182 void releaseSound(); 183 184 /** 185 * Update the state of a given camera device (open/close/active/idle) with 186 * the camera proxy service in the system service 187 */ 188 static void updateProxyDeviceState( 189 int newState, 190 const String8& cameraId, 191 int facing, 192 const String16& clientName, 193 int apiLevel); 194 195 ///////////////////////////////////////////////////////////////////// 196 // CameraDeviceFactory functionality 197 int getDeviceVersion(const String8& cameraId, int* facing = NULL); 198 199 ///////////////////////////////////////////////////////////////////// 200 // Shared utilities 201 static binder::Status filterGetInfoErrorCode(status_t err); 202 203 ///////////////////////////////////////////////////////////////////// 204 // CameraClient functionality 205 206 class BasicClient : public virtual RefBase { 207 public: 208 virtual status_t initialize(sp<CameraProviderManager> manager, 209 const String8& monitorTags) = 0; 210 virtual binder::Status disconnect(); 211 212 // because we can't virtually inherit IInterface, which breaks 213 // virtual inheritance 214 virtual sp<IBinder> asBinderWrapper() = 0; 215 216 // Return the remote callback binder object (e.g. ICameraDeviceCallbacks) 217 sp<IBinder> getRemote() { 218 return mRemoteBinder; 219 } 220 221 // Disallows dumping over binder interface 222 virtual status_t dump(int fd, const Vector<String16>& args); 223 // Internal dump method to be called by CameraService 224 virtual status_t dumpClient(int fd, const Vector<String16>& args) = 0; 225 226 // Return the package name for this client 227 virtual String16 getPackageName() const; 228 229 // Notify client about a fatal error 230 virtual void notifyError(int32_t errorCode, 231 const CaptureResultExtras& resultExtras) = 0; 232 233 // Get the UID of the application client using this 234 virtual uid_t getClientUid() const; 235 236 // Get the PID of the application client using this 237 virtual int getClientPid() const; 238 239 // Check what API level is used for this client. This is used to determine which 240 // superclass this can be cast to. 241 virtual bool canCastToApiClient(apiLevel level) const; 242 243 // Block the client form using the camera 244 virtual void block(); 245 protected: 246 BasicClient(const sp<CameraService>& cameraService, 247 const sp<IBinder>& remoteCallback, 248 const String16& clientPackageName, 249 const String8& cameraIdStr, 250 int cameraFacing, 251 int clientPid, 252 uid_t clientUid, 253 int servicePid); 254 255 virtual ~BasicClient(); 256 257 // the instance is in the middle of destruction. When this is set, 258 // the instance should not be accessed from callback. 259 // CameraService's mClientLock should be acquired to access this. 260 // - subclasses should set this to true in their destructors. 261 bool mDestructionStarted; 262 263 // these are initialized in the constructor. 264 static sp<CameraService> sCameraService; 265 const String8 mCameraIdStr; 266 const int mCameraFacing; 267 String16 mClientPackageName; 268 pid_t mClientPid; 269 const uid_t mClientUid; 270 const pid_t mServicePid; 271 bool mDisconnected; 272 273 // - The app-side Binder interface to receive callbacks from us 274 sp<IBinder> mRemoteBinder; // immutable after constructor 275 276 // permissions management 277 status_t startCameraOps(); 278 status_t finishCameraOps(); 279 280 private: 281 AppOpsManager mAppOpsManager; 282 283 class OpsCallback : public BnAppOpsCallback { 284 public: 285 explicit OpsCallback(wp<BasicClient> client); 286 virtual void opChanged(int32_t op, const String16& packageName); 287 288 private: 289 wp<BasicClient> mClient; 290 291 }; // class OpsCallback 292 293 sp<OpsCallback> mOpsCallback; 294 // Track whether startCameraOps was called successfully, to avoid 295 // finishing what we didn't start. 296 bool mOpsActive; 297 298 // IAppOpsCallback interface, indirected through opListener 299 virtual void opChanged(int32_t op, const String16& packageName); 300 }; // class BasicClient 301 302 class Client : public hardware::BnCamera, public BasicClient 303 { 304 public: 305 typedef hardware::ICameraClient TCamCallbacks; 306 307 // ICamera interface (see ICamera for details) 308 virtual binder::Status disconnect(); 309 virtual status_t connect(const sp<hardware::ICameraClient>& client) = 0; 310 virtual status_t lock() = 0; 311 virtual status_t unlock() = 0; 312 virtual status_t setPreviewTarget(const sp<IGraphicBufferProducer>& bufferProducer)=0; 313 virtual void setPreviewCallbackFlag(int flag) = 0; 314 virtual status_t setPreviewCallbackTarget( 315 const sp<IGraphicBufferProducer>& callbackProducer) = 0; 316 virtual status_t startPreview() = 0; 317 virtual void stopPreview() = 0; 318 virtual bool previewEnabled() = 0; 319 virtual status_t setVideoBufferMode(int32_t videoBufferMode) = 0; 320 virtual status_t startRecording() = 0; 321 virtual void stopRecording() = 0; 322 virtual bool recordingEnabled() = 0; 323 virtual void releaseRecordingFrame(const sp<IMemory>& mem) = 0; 324 virtual status_t autoFocus() = 0; 325 virtual status_t cancelAutoFocus() = 0; 326 virtual status_t takePicture(int msgType) = 0; 327 virtual status_t setParameters(const String8& params) = 0; 328 virtual String8 getParameters() const = 0; 329 virtual status_t sendCommand(int32_t cmd, int32_t arg1, int32_t arg2) = 0; 330 virtual status_t setVideoTarget(const sp<IGraphicBufferProducer>& bufferProducer) = 0; 331 332 // Interface used by CameraService 333 Client(const sp<CameraService>& cameraService, 334 const sp<hardware::ICameraClient>& cameraClient, 335 const String16& clientPackageName, 336 const String8& cameraIdStr, 337 int api1CameraId, 338 int cameraFacing, 339 int clientPid, 340 uid_t clientUid, 341 int servicePid); 342 ~Client(); 343 344 // return our camera client 345 const sp<hardware::ICameraClient>& getRemoteCallback() { 346 return mRemoteCallback; 347 } 348 349 virtual sp<IBinder> asBinderWrapper() { 350 return asBinder(this); 351 } 352 353 virtual void notifyError(int32_t errorCode, 354 const CaptureResultExtras& resultExtras); 355 356 // Check what API level is used for this client. This is used to determine which 357 // superclass this can be cast to. 358 virtual bool canCastToApiClient(apiLevel level) const; 359 protected: 360 // Initialized in constructor 361 362 // - The app-side Binder interface to receive callbacks from us 363 sp<hardware::ICameraClient> mRemoteCallback; 364 365 int mCameraId; // All API1 clients use integer camera IDs 366 }; // class Client 367 368 /** 369 * A listener class that implements the LISTENER interface for use with a ClientManager, and 370 * implements the following methods: 371 * void onClientRemoved(const ClientDescriptor<KEY, VALUE>& descriptor); 372 * void onClientAdded(const ClientDescriptor<KEY, VALUE>& descriptor); 373 */ 374 class ClientEventListener { 375 public: 376 void onClientAdded(const resource_policy::ClientDescriptor<String8, 377 sp<CameraService::BasicClient>>& descriptor); 378 void onClientRemoved(const resource_policy::ClientDescriptor<String8, 379 sp<CameraService::BasicClient>>& descriptor); 380 }; // class ClientEventListener 381 382 typedef std::shared_ptr<resource_policy::ClientDescriptor<String8, 383 sp<CameraService::BasicClient>>> DescriptorPtr; 384 385 /** 386 * A container class for managing active camera clients that are using HAL devices. Active 387 * clients are represented by ClientDescriptor objects that contain strong pointers to the 388 * actual BasicClient subclass binder interface implementation. 389 * 390 * This class manages the eviction behavior for the camera clients. See the parent class 391 * implementation in utils/ClientManager for the specifics of this behavior. 392 */ 393 class CameraClientManager : public resource_policy::ClientManager<String8, 394 sp<CameraService::BasicClient>, ClientEventListener> { 395 public: 396 CameraClientManager(); 397 virtual ~CameraClientManager(); 398 399 /** 400 * Return a strong pointer to the active BasicClient for this camera ID, or an empty 401 * if none exists. 402 */ 403 sp<CameraService::BasicClient> getCameraClient(const String8& id) const; 404 405 /** 406 * Return a string describing the current state. 407 */ 408 String8 toString() const; 409 410 /** 411 * Make a ClientDescriptor object wrapping the given BasicClient strong pointer. 412 */ 413 static DescriptorPtr makeClientDescriptor(const String8& key, const sp<BasicClient>& value, 414 int32_t cost, const std::set<String8>& conflictingKeys, int32_t score, 415 int32_t ownerId, int32_t state); 416 417 /** 418 * Make a ClientDescriptor object wrapping the given BasicClient strong pointer with 419 * values intialized from a prior ClientDescriptor. 420 */ 421 static DescriptorPtr makeClientDescriptor(const sp<BasicClient>& value, 422 const CameraService::DescriptorPtr& partial); 423 424 }; // class CameraClientManager 425 426 private: 427 428 typedef hardware::camera::common::V1_0::CameraDeviceStatus CameraDeviceStatus; 429 430 /** 431 * Typesafe version of device status, containing both the HAL-layer and the service interface- 432 * layer values. 433 */ 434 enum class StatusInternal : int32_t { 435 NOT_PRESENT = static_cast<int32_t>(CameraDeviceStatus::NOT_PRESENT), 436 PRESENT = static_cast<int32_t>(CameraDeviceStatus::PRESENT), 437 ENUMERATING = static_cast<int32_t>(CameraDeviceStatus::ENUMERATING), 438 NOT_AVAILABLE = static_cast<int32_t>(hardware::ICameraServiceListener::STATUS_NOT_AVAILABLE), 439 UNKNOWN = static_cast<int32_t>(hardware::ICameraServiceListener::STATUS_UNKNOWN) 440 }; 441 442 /** 443 * Container class for the state of each logical camera device, including: ID, status, and 444 * dependencies on other devices. The mapping of camera ID -> state saved in mCameraStates 445 * represents the camera devices advertised by the HAL (and any USB devices, when we add 446 * those). 447 * 448 * This container does NOT represent an active camera client. These are represented using 449 * the ClientDescriptors stored in mActiveClientManager. 450 */ 451 class CameraState { 452 public: 453 454 /** 455 * Make a new CameraState and set the ID, cost, and conflicting devices using the values 456 * returned in the HAL's camera_info struct for each device. 457 */ 458 CameraState(const String8& id, int cost, const std::set<String8>& conflicting); 459 virtual ~CameraState(); 460 461 /** 462 * Return the status for this device. 463 * 464 * This method acquires mStatusLock. 465 */ 466 StatusInternal getStatus() const; 467 468 /** 469 * This function updates the status for this camera device, unless the given status 470 * is in the given list of rejected status states, and execute the function passed in 471 * with a signature onStatusUpdateLocked(const String8&, int32_t) 472 * if the status has changed. 473 * 474 * This method is idempotent, and will not result in the function passed to 475 * onStatusUpdateLocked being called more than once for the same arguments. 476 * This method aquires mStatusLock. 477 */ 478 template<class Func> 479 void updateStatus(StatusInternal status, 480 const String8& cameraId, 481 std::initializer_list<StatusInternal> rejectSourceStates, 482 Func onStatusUpdatedLocked); 483 484 /** 485 * Return the last set CameraParameters object generated from the information returned by 486 * the HAL for this device (or an empty CameraParameters object if none has been set). 487 */ 488 CameraParameters getShimParams() const; 489 490 /** 491 * Set the CameraParameters for this device. 492 */ 493 void setShimParams(const CameraParameters& params); 494 495 /** 496 * Return the resource_cost advertised by the HAL for this device. 497 */ 498 int getCost() const; 499 500 /** 501 * Return a set of the IDs of conflicting devices advertised by the HAL for this device. 502 */ 503 std::set<String8> getConflicting() const; 504 505 /** 506 * Return the ID of this camera device. 507 */ 508 String8 getId() const; 509 510 private: 511 const String8 mId; 512 StatusInternal mStatus; // protected by mStatusLock 513 const int mCost; 514 std::set<String8> mConflicting; 515 mutable Mutex mStatusLock; 516 CameraParameters mShimParams; 517 }; // class CameraState 518 519 // Observer for UID lifecycle enforcing that UIDs in idle 520 // state cannot use the camera to protect user privacy. 521 class UidPolicy : public BnUidObserver, public virtual IBinder::DeathRecipient { 522 public: 523 explicit UidPolicy(sp<CameraService> service) 524 : mRegistered(false), mService(service) {} 525 526 void registerSelf(); 527 void unregisterSelf(); 528 529 bool isUidActive(uid_t uid, String16 callingPackage); 530 531 void onUidGone(uid_t uid, bool disabled); 532 void onUidActive(uid_t uid); 533 void onUidIdle(uid_t uid, bool disabled); 534 535 void addOverrideUid(uid_t uid, String16 callingPackage, bool active); 536 void removeOverrideUid(uid_t uid, String16 callingPackage); 537 538 // IBinder::DeathRecipient implementation 539 virtual void binderDied(const wp<IBinder> &who); 540 private: 541 bool isUidActiveLocked(uid_t uid, String16 callingPackage); 542 void updateOverrideUid(uid_t uid, String16 callingPackage, bool active, bool insert); 543 544 Mutex mUidLock; 545 bool mRegistered; 546 wp<CameraService> mService; 547 std::unordered_set<uid_t> mActiveUids; 548 std::unordered_map<uid_t, bool> mOverrideUids; 549 }; // class UidPolicy 550 551 sp<UidPolicy> mUidPolicy; 552 553 // Delay-load the Camera HAL module 554 virtual void onFirstRef(); 555 556 // Eumerate all camera providers in the system 557 status_t enumerateProviders(); 558 559 // Add/remove a new camera to camera and torch state lists or remove an unplugged one 560 // Caller must not hold mServiceLock 561 void addStates(const String8 id); 562 void removeStates(const String8 id); 563 564 // Check if we can connect, before we acquire the service lock. 565 // The returned originalClientPid is the PID of the original process that wants to connect to 566 // camera. 567 // The returned clientPid is the PID of the client that directly connects to camera. 568 // originalClientPid and clientPid are usually the same except when the application uses 569 // mediaserver to connect to camera (using MediaRecorder to connect to camera). In that case, 570 // clientPid is the PID of mediaserver and originalClientPid is the PID of the application. 571 binder::Status validateConnectLocked(const String8& cameraId, const String8& clientName8, 572 /*inout*/int& clientUid, /*inout*/int& clientPid, /*out*/int& originalClientPid) const; 573 binder::Status validateClientPermissionsLocked(const String8& cameraId, const String8& clientName8, 574 /*inout*/int& clientUid, /*inout*/int& clientPid, /*out*/int& originalClientPid) const; 575 576 // Handle active client evictions, and update service state. 577 // Only call with with mServiceLock held. 578 status_t handleEvictionsLocked(const String8& cameraId, int clientPid, 579 apiLevel effectiveApiLevel, const sp<IBinder>& remoteCallback, const String8& packageName, 580 /*out*/ 581 sp<BasicClient>* client, 582 std::shared_ptr<resource_policy::ClientDescriptor<String8, sp<BasicClient>>>* partial); 583 584 // Single implementation shared between the various connect calls 585 template<class CALLBACK, class CLIENT> 586 binder::Status connectHelper(const sp<CALLBACK>& cameraCb, const String8& cameraId, 587 int api1CameraId, int halVersion, const String16& clientPackageName, 588 int clientUid, int clientPid, 589 apiLevel effectiveApiLevel, bool legacyMode, bool shimUpdateOnly, 590 /*out*/sp<CLIENT>& device); 591 592 // Lock guarding camera service state 593 Mutex mServiceLock; 594 595 // Condition to use with mServiceLock, used to handle simultaneous connect calls from clients 596 std::shared_ptr<WaitableMutexWrapper> mServiceLockWrapper; 597 598 // Return NO_ERROR if the device with a give ID can be connected to 599 status_t checkIfDeviceIsUsable(const String8& cameraId) const; 600 601 // Container for managing currently active application-layer clients 602 CameraClientManager mActiveClientManager; 603 604 // Mapping from camera ID -> state for each device, map is protected by mCameraStatesLock 605 std::map<String8, std::shared_ptr<CameraState>> mCameraStates; 606 607 // Mutex guarding mCameraStates map 608 mutable Mutex mCameraStatesLock; 609 610 // Circular buffer for storing event logging for dumps 611 RingBuffer<String8> mEventLog; 612 Mutex mLogLock; 613 614 // The last monitored tags set by client 615 String8 mMonitorTags; 616 617 // Currently allowed user IDs 618 std::set<userid_t> mAllowedUsers; 619 620 /** 621 * Get the camera state for a given camera id. 622 * 623 * This acquires mCameraStatesLock. 624 */ 625 std::shared_ptr<CameraService::CameraState> getCameraState(const String8& cameraId) const; 626 627 /** 628 * Evict client who's remote binder has died. Returns true if this client was in the active 629 * list and was disconnected. 630 * 631 * This method acquires mServiceLock. 632 */ 633 bool evictClientIdByRemote(const wp<IBinder>& cameraClient); 634 635 /** 636 * Remove the given client from the active clients list; does not disconnect the client. 637 * 638 * This method acquires mServiceLock. 639 */ 640 void removeByClient(const BasicClient* client); 641 642 /** 643 * Add new client to active clients list after conflicting clients have disconnected using the 644 * values set in the partial descriptor passed in to construct the actual client descriptor. 645 * This is typically called at the end of a connect call. 646 * 647 * This method must be called with mServiceLock held. 648 */ 649 void finishConnectLocked(const sp<BasicClient>& client, const DescriptorPtr& desc); 650 651 /** 652 * Returns the underlying camera Id string mapped to a camera id int 653 * Empty string is returned when the cameraIdInt is invalid. 654 */ 655 String8 cameraIdIntToStr(int cameraIdInt); 656 657 /** 658 * Returns the underlying camera Id string mapped to a camera id int 659 * Empty string is returned when the cameraIdInt is invalid. 660 */ 661 std::string cameraIdIntToStrLocked(int cameraIdInt); 662 663 /** 664 * Remove a single client corresponding to the given camera id from the list of active clients. 665 * If none exists, return an empty strongpointer. 666 * 667 * This method must be called with mServiceLock held. 668 */ 669 sp<CameraService::BasicClient> removeClientLocked(const String8& cameraId); 670 671 /** 672 * Handle a notification that the current device user has changed. 673 */ 674 void doUserSwitch(const std::vector<int32_t>& newUserIds); 675 676 /** 677 * Add an event log message. 678 */ 679 void logEvent(const char* event); 680 681 /** 682 * Add an event log message that a client has been disconnected. 683 */ 684 void logDisconnected(const char* cameraId, int clientPid, const char* clientPackage); 685 686 /** 687 * Add an event log message that a client has been connected. 688 */ 689 void logConnected(const char* cameraId, int clientPid, const char* clientPackage); 690 691 /** 692 * Add an event log message that a client's connect attempt has been rejected. 693 */ 694 void logRejected(const char* cameraId, int clientPid, const char* clientPackage, 695 const char* reason); 696 697 /** 698 * Add an event log message that the current device user has been switched. 699 */ 700 void logUserSwitch(const std::set<userid_t>& oldUserIds, 701 const std::set<userid_t>& newUserIds); 702 703 /** 704 * Add an event log message that a device has been removed by the HAL 705 */ 706 void logDeviceRemoved(const char* cameraId, const char* reason); 707 708 /** 709 * Add an event log message that a device has been added by the HAL 710 */ 711 void logDeviceAdded(const char* cameraId, const char* reason); 712 713 /** 714 * Add an event log message that a client has unexpectedly died. 715 */ 716 void logClientDied(int clientPid, const char* reason); 717 718 /** 719 * Add a event log message that a serious service-level error has occured 720 * The errorCode should be one of the Android Errors 721 */ 722 void logServiceError(const char* msg, int errorCode); 723 724 /** 725 * Dump the event log to an FD 726 */ 727 void dumpEventLog(int fd); 728 729 /** 730 * This method will acquire mServiceLock 731 */ 732 void updateCameraNumAndIds(); 733 734 int mNumberOfCameras; 735 736 std::vector<std::string> mNormalDeviceIds; 737 738 // sounds 739 sp<MediaPlayer> newMediaPlayer(const char *file); 740 741 Mutex mSoundLock; 742 sp<MediaPlayer> mSoundPlayer[NUM_SOUNDS]; 743 int mSoundRef; // reference count (release all MediaPlayer when 0) 744 745 // Basic flag on whether the camera subsystem is in a usable state 746 bool mInitialized; 747 748 sp<CameraProviderManager> mCameraProviderManager; 749 750 // Guarded by mStatusListenerMutex 751 std::vector<sp<hardware::ICameraServiceListener>> mListenerList; 752 Mutex mStatusListenerLock; 753 754 /** 755 * Update the status for the given camera id (if that device exists), and broadcast the 756 * status update to all current ICameraServiceListeners if the status has changed. Any 757 * statuses in rejectedSourceStates will be ignored. 758 * 759 * This method must be idempotent. 760 * This method acquires mStatusLock and mStatusListenerLock. 761 */ 762 void updateStatus(StatusInternal status, 763 const String8& cameraId, 764 std::initializer_list<StatusInternal> 765 rejectedSourceStates); 766 void updateStatus(StatusInternal status, 767 const String8& cameraId); 768 769 // flashlight control 770 sp<CameraFlashlight> mFlashlight; 771 // guard mTorchStatusMap 772 Mutex mTorchStatusMutex; 773 // guard mTorchClientMap 774 Mutex mTorchClientMapMutex; 775 // guard mTorchUidMap 776 Mutex mTorchUidMapMutex; 777 // camera id -> torch status 778 KeyedVector<String8, hardware::camera::common::V1_0::TorchModeStatus> 779 mTorchStatusMap; 780 // camera id -> torch client binder 781 // only store the last client that turns on each camera's torch mode 782 KeyedVector<String8, sp<IBinder>> mTorchClientMap; 783 // camera id -> [incoming uid, current uid] pair 784 std::map<String8, std::pair<int, int>> mTorchUidMap; 785 786 // check and handle if torch client's process has died 787 void handleTorchClientBinderDied(const wp<IBinder> &who); 788 789 // handle torch mode status change and invoke callbacks. mTorchStatusMutex 790 // should be locked. 791 void onTorchStatusChangedLocked(const String8& cameraId, 792 hardware::camera::common::V1_0::TorchModeStatus newStatus); 793 794 // get a camera's torch status. mTorchStatusMutex should be locked. 795 status_t getTorchStatusLocked(const String8 &cameraId, 796 hardware::camera::common::V1_0::TorchModeStatus *status) const; 797 798 // set a camera's torch status. mTorchStatusMutex should be locked. 799 status_t setTorchStatusLocked(const String8 &cameraId, 800 hardware::camera::common::V1_0::TorchModeStatus status); 801 802 // IBinder::DeathRecipient implementation 803 virtual void binderDied(const wp<IBinder> &who); 804 805 /** 806 * Initialize and cache the metadata used by the HAL1 shim for a given cameraId. 807 * 808 * Sets Status to a service-specific error on failure 809 */ 810 binder::Status initializeShimMetadata(int cameraId); 811 812 /** 813 * Get the cached CameraParameters for the camera. If they haven't been 814 * cached yet, then initialize them for the first time. 815 * 816 * Sets Status to a service-specific error on failure 817 */ 818 binder::Status getLegacyParametersLazy(int cameraId, /*out*/CameraParameters* parameters); 819 820 // Blocks all clients from the UID 821 void blockClientsForUid(uid_t uid); 822 823 // Overrides the UID state as if it is idle 824 status_t handleSetUidState(const Vector<String16>& args, int err); 825 826 // Clears the override for the UID state 827 status_t handleResetUidState(const Vector<String16>& args, int err); 828 829 // Gets the UID state 830 status_t handleGetUidState(const Vector<String16>& args, int out, int err); 831 832 // Prints the shell command help 833 status_t printHelp(int out); 834 835 static int getCallingPid(); 836 837 static int getCallingUid(); 838 839 /** 840 * Get the current system time as a formatted string. 841 */ 842 static String8 getFormattedCurrentTime(); 843 844 static binder::Status makeClient(const sp<CameraService>& cameraService, 845 const sp<IInterface>& cameraCb, const String16& packageName, const String8& cameraId, 846 int api1CameraId, int facing, int clientPid, uid_t clientUid, int servicePid, 847 bool legacyMode, int halVersion, int deviceVersion, apiLevel effectiveApiLevel, 848 /*out*/sp<BasicClient>* client); 849 850 status_t checkCameraAccess(const String16& opPackageName); 851 852 static String8 toString(std::set<userid_t> intSet); 853 static int32_t mapToInterface(hardware::camera::common::V1_0::TorchModeStatus status); 854 static StatusInternal mapToInternal(hardware::camera::common::V1_0::CameraDeviceStatus status); 855 static int32_t mapToInterface(StatusInternal status); 856 857 static sp<hardware::ICameraServiceProxy> getCameraServiceProxy(); 858 static void pingCameraServiceProxy(); 859 860 }; 861 862 } // namespace android 863 864 #endif 865