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

Commit 607fc7dd authored by Ján Sebechlebský's avatar Ján Sebechlebský Committed by Android (Google) Code Review
Browse files

Merge "Throw UnsupportedOperationException from registerCamera" into main

parents 3015aeb5 b36090e7
Loading
Loading
Loading
Loading
+35 −3
Original line number Diff line number Diff line
@@ -19,10 +19,9 @@
#include "VirtualCameraService.h"

#include <algorithm>
#include <array>
#include <cinttypes>
#include <cstdint>
#include <cstdio>
#include <iterator>
#include <memory>
#include <mutex>
#include <optional>
@@ -38,6 +37,9 @@
#include "android/binder_libbinder.h"
#include "android/binder_status.h"
#include "binder/Status.h"
#include "fmt/format.h"
#include "util/EglDisplayContext.h"
#include "util/EglUtil.h"
#include "util/Permissions.h"
#include "util/Util.h"

@@ -79,6 +81,12 @@ Available commands:
constexpr char kCreateVirtualDevicePermission[] =
    "android.permission.CREATE_VIRTUAL_DEVICE";

constexpr std::array<const char*, 3> kRequiredEglExtensions = {
    "GL_OES_EGL_image_external",
    "GL_OES_EGL_image_external_essl3",
    "GL_EXT_YUV_target",
};

ndk::ScopedAStatus validateConfiguration(
    const VirtualCameraConfiguration& configuration) {
  if (configuration.supportedStreamConfigs.empty()) {
@@ -176,6 +184,23 @@ std::variant<CommandWithOptions, std::string> parseCommand(
  return cmd;
};

ndk::ScopedAStatus verifyRequiredEglExtensions() {
  EglDisplayContext context;
  for (const char* eglExtension : kRequiredEglExtensions) {
    if (!isGlExtensionSupported(eglExtension)) {
      ALOGE("%s not supported", eglExtension);
      return ndk::ScopedAStatus::fromExceptionCodeWithMessage(
          EX_UNSUPPORTED_OPERATION,
          fmt::format(
              "Cannot create virtual camera, because required EGL extension {} "
              "is not supported on this system",
              eglExtension)
              .c_str());
    }
  }
  return ndk::ScopedAStatus::ok();
}

}  // namespace

VirtualCameraService::VirtualCameraService(
@@ -207,7 +232,13 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera(
        Status::EX_ILLEGAL_ARGUMENT);
  }

  *_aidl_return = true;
  if (mVerifyEglExtensions) {
    auto status = verifyRequiredEglExtensions();
    if (!status.isOk()) {
      *_aidl_return = false;
      return status;
    }
  }

  auto status = validateConfiguration(configuration);
  if (!status.isOk()) {
@@ -237,6 +268,7 @@ ndk::ScopedAStatus VirtualCameraService::registerCamera(
  }

  mTokenToCameraName[token] = camera->getCameraName();
  *_aidl_return = true;
  return ndk::ScopedAStatus::ok();
}

+7 −1
Original line number Diff line number Diff line
@@ -69,6 +69,12 @@ class VirtualCameraService
  binder_status_t handleShellCommand(int in, int out, int err, const char** args,
                                     uint32_t numArgs) override;

  // Do not verify presence on required EGL extensions when registering virtual
  // camera. Only to be used by unit tests.
  void disableEglVerificationForTest() {
    mVerifyEglExtensions = false;
  }

 private:
  // Create and enable test camera instance if there's none.
  binder_status_t enableTestCameraCmd(
@@ -77,7 +83,7 @@ class VirtualCameraService
  void disableTestCameraCmd(int out);

  std::shared_ptr<VirtualCameraProvider> mVirtualCameraProvider;

  bool mVerifyEglExtensions = true;
  const PermissionsProxy& mPermissionProxy;

  std::mutex mLock;
+1 −0
Original line number Diff line number Diff line
@@ -118,6 +118,7 @@ class VirtualCameraServiceTest : public ::testing::Test {
    mCameraProvider->setCallback(mMockCameraProviderCallback);
    mCameraService = ndk::SharedRefBase::make<VirtualCameraService>(
        mCameraProvider, mMockPermissionsProxy);
    mCameraService->disableEglVerificationForTest();

    ON_CALL(mMockPermissionsProxy, checkCallingPermission)
        .WillByDefault(Return(true));