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

Commit ca6625b9 authored by Albert Chaulk's avatar Albert Chaulk
Browse files

vrwm: Add a listener for enter/exit vr mode events

This uses the same system service SurfaceFlinger does

Bug: 35917583
Test: Launch VR app, press home button, lock screen. Check vrwm
  recieves event

Change-Id: I923c24b9d495a4bfbfb3512cfb52760d6947fdbf
parent d1add22b
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -61,6 +61,7 @@ static_libs := \
  libperformance \
  libperformance \
  libpdx_default_transport \
  libpdx_default_transport \
  libcutils \
  libcutils \
  libvr_manager \


shared_libs := \
shared_libs := \
  android.dvr.composer@1.0 \
  android.dvr.composer@1.0 \
+23 −1
Original line number Original line Diff line number Diff line
@@ -17,9 +17,16 @@
namespace android {
namespace android {
namespace dvr {
namespace dvr {


Application::Application() {}
Application::Application() {
  vr_mode_listener_ = new VrModeListener(this);
}


Application::~Application() {
Application::~Application() {
  sp<IVrManager> vrManagerService = interface_cast<IVrManager>(
      defaultServiceManager()->getService(String16("vrmanager")));
  if (vrManagerService.get()) {
    vrManagerService->unregisterListener(vr_mode_listener_);
  }
}
}


int Application::Initialize() {
int Application::Initialize() {
@@ -29,6 +36,11 @@ int Application::Initialize() {
  elbow_model_.Enable(ElbowModel::kDefaultNeckPosition, is_right_handed);
  elbow_model_.Enable(ElbowModel::kDefaultNeckPosition, is_right_handed);
  last_frame_time_ = std::chrono::system_clock::now();
  last_frame_time_ = std::chrono::system_clock::now();


  sp<IVrManager> vrManagerService = interface_cast<IVrManager>(
      defaultServiceManager()->getService(String16("vrmanager")));
  if (vrManagerService.get()) {
    vrManagerService->registerListener(vr_mode_listener_);
  }
  return 0;
  return 0;
}
}


@@ -274,6 +286,11 @@ void Application::ProcessControllerInput() {
}
}


void Application::SetVisibility(bool visible) {
void Application::SetVisibility(bool visible) {
  if (visible && !initialized_) {
    if (AllocateResources())
      ALOGE("Failed to allocate resources");
  }

  bool changed = is_visible_ != visible;
  bool changed = is_visible_ != visible;
  if (changed) {
  if (changed) {
    is_visible_ = visible;
    is_visible_ = visible;
@@ -296,5 +313,10 @@ void Application::QueueTask(MainThreadTask task) {
  wake_up_init_and_render_.notify_one();
  wake_up_init_and_render_.notify_one();
}
}


void Application::VrModeListener::onVrStateChanged(bool enabled) {
  if (!enabled)
    app_->QueueTask(MainThreadTask::ExitingVrMode);
}

}  // namespace dvr
}  // namespace dvr
}  // namespace android
}  // namespace android
+11 −0
Original line number Original line Diff line number Diff line
@@ -4,6 +4,7 @@
#include <memory>
#include <memory>
#include <private/dvr/types.h>
#include <private/dvr/types.h>
#include <stdint.h>
#include <stdint.h>
#include <vr/vr_manager/vr_manager.h>


#include <chrono>
#include <chrono>
#include <mutex>
#include <mutex>
@@ -43,6 +44,16 @@ class Application {
    Show,
    Show,
  };
  };


  class VrModeListener : public BnVrStateCallbacks {
   public:
    VrModeListener(Application *app) : app_(app) {}
    void onVrStateChanged(bool enabled) override;

   private:
    Application *app_;
  };

  sp<VrModeListener> vr_mode_listener_;
  virtual void OnDrawFrame() = 0;
  virtual void OnDrawFrame() = 0;
  virtual void DrawEye(EyeType eye, const mat4& perspective,
  virtual void DrawEye(EyeType eye, const mat4& perspective,
                       const mat4& eye_matrix, const mat4& head_matrix) = 0;
                       const mat4& eye_matrix, const mat4& head_matrix) = 0;
+0 −1
Original line number Original line Diff line number Diff line
@@ -419,7 +419,6 @@ base::unique_fd ShellView::OnFrame(std::unique_ptr<HwcCallback::Frame> frame) {
  // so give it a kick.
  // so give it a kick.
  if (visibility != ViewMode::Hidden &&
  if (visibility != ViewMode::Hidden &&
      current_frame_.visibility == ViewMode::Hidden) {
      current_frame_.visibility == ViewMode::Hidden) {
    QueueTask(MainThreadTask::EnteringVrMode);
    QueueTask(MainThreadTask::Show);
    QueueTask(MainThreadTask::Show);
  }
  }