1aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara#include "vr_composer.h"
2aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
30b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara#include <binder/IPCThreadState.h>
40b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara#include <binder/PermissionCache.h>
50b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
6aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaranamespace android {
7aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaranamespace dvr {
80b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoaranamespace {
90b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
100b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoarabool CheckPermission() {
110b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const android::IPCThreadState* ipc = android::IPCThreadState::self();
120b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const pid_t pid = ipc->getCallingPid();
130b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const uid_t uid = ipc->getCallingUid();
140b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  const bool permission = PermissionCache::checkPermission(
150b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara      String16("android.permission.RESTRICTED_VR_ACCESS"), pid, uid);
160b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  if (!permission)
170b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara    ALOGE("permission denied to pid=%d uid=%u", pid, uid);
180b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
190b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  return permission;
200b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara}
210b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
220b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara}  // namespace
23aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
24aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel NicoaraVrComposer::VrComposer() {}
25aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
26aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel NicoaraVrComposer::~VrComposer() {}
27aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
28aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoarabinder::Status VrComposer::registerObserver(
29aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    const sp<IVrComposerCallback>& callback) {
30aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
31aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
320b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara  if (!CheckPermission())
330b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara    return binder::Status::fromStatusT(PERMISSION_DENIED);
340b4c80ac82959711738af326b6781f2a8e5ca542Daniel Nicoara
35aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  if (callback_.get()) {
36aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    ALOGE("Failed to register callback, already registered");
37aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    return binder::Status::fromStatusT(ALREADY_EXISTS);
38aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  }
39aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
40aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  callback_ = callback;
41aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  IInterface::asBinder(callback_)->linkToDeath(this);
42aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  return binder::Status::ok();
43aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
44aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
45aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoarabase::unique_fd VrComposer::OnNewFrame(const ComposerView::Frame& frame) {
46aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
47aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
48aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  if (!callback_.get())
49aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    return base::unique_fd();
50aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
51aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ParcelableComposerFrame parcelable_frame(frame);
52aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  ParcelableUniqueFd fence;
53aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  binder::Status ret = callback_->onNewFrame(parcelable_frame, &fence);
54aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  if (!ret.isOk())
55aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara    ALOGE("Failed to send new frame: %s", ret.toString8().string());
56aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
57aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  return fence.fence();
58aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
59aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
60aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoaravoid VrComposer::binderDied(const wp<IBinder>& /* who */) {
61aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  std::lock_guard<std::mutex> guard(mutex_);
62aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
63aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara  callback_ = nullptr;
64aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}
65aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara
66aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}  // namespace dvr
67aba4d01add2e961f8b24a6281f3c616f916eb92fDaniel Nicoara}  // namespace android
68