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