diff options
| -rw-r--r-- | services/vr/vr_window_manager/Android.mk | 1 | ||||
| -rw-r--r-- | services/vr/vr_window_manager/application.cpp | 24 | ||||
| -rw-r--r-- | services/vr/vr_window_manager/application.h | 11 | ||||
| -rw-r--r-- | services/vr/vr_window_manager/shell_view.cpp | 1 |
4 files changed, 35 insertions, 2 deletions
diff --git a/services/vr/vr_window_manager/Android.mk b/services/vr/vr_window_manager/Android.mk index e9552bc4d8..aa20d8849d 100644 --- a/services/vr/vr_window_manager/Android.mk +++ b/services/vr/vr_window_manager/Android.mk @@ -61,6 +61,7 @@ static_libs := \ libperformance \ libpdx_default_transport \ libcutils \ + libvr_manager \ shared_libs := \ android.dvr.composer@1.0 \ diff --git a/services/vr/vr_window_manager/application.cpp b/services/vr/vr_window_manager/application.cpp index 467e95eee9..dba797f38a 100644 --- a/services/vr/vr_window_manager/application.cpp +++ b/services/vr/vr_window_manager/application.cpp @@ -17,9 +17,16 @@ namespace android { namespace dvr { -Application::Application() {} +Application::Application() { + vr_mode_listener_ = new VrModeListener(this); +} Application::~Application() { + sp<IVrManager> vrManagerService = interface_cast<IVrManager>( + defaultServiceManager()->getService(String16("vrmanager"))); + if (vrManagerService.get()) { + vrManagerService->unregisterListener(vr_mode_listener_); + } } int Application::Initialize() { @@ -29,6 +36,11 @@ int Application::Initialize() { elbow_model_.Enable(ElbowModel::kDefaultNeckPosition, is_right_handed); 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; } @@ -274,6 +286,11 @@ void Application::ProcessControllerInput() { } void Application::SetVisibility(bool visible) { + if (visible && !initialized_) { + if (AllocateResources()) + ALOGE("Failed to allocate resources"); + } + bool changed = is_visible_ != visible; if (changed) { is_visible_ = visible; @@ -296,5 +313,10 @@ void Application::QueueTask(MainThreadTask task) { wake_up_init_and_render_.notify_one(); } +void Application::VrModeListener::onVrStateChanged(bool enabled) { + if (!enabled) + app_->QueueTask(MainThreadTask::ExitingVrMode); +} + } // namespace dvr } // namespace android diff --git a/services/vr/vr_window_manager/application.h b/services/vr/vr_window_manager/application.h index c7aa4dd87d..2c60e0a19e 100644 --- a/services/vr/vr_window_manager/application.h +++ b/services/vr/vr_window_manager/application.h @@ -4,6 +4,7 @@ #include <memory> #include <private/dvr/types.h> #include <stdint.h> +#include <vr/vr_manager/vr_manager.h> #include <chrono> #include <mutex> @@ -43,6 +44,16 @@ class Application { 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 DrawEye(EyeType eye, const mat4& perspective, const mat4& eye_matrix, const mat4& head_matrix) = 0; diff --git a/services/vr/vr_window_manager/shell_view.cpp b/services/vr/vr_window_manager/shell_view.cpp index 9d0aaad96b..2a93e81d27 100644 --- a/services/vr/vr_window_manager/shell_view.cpp +++ b/services/vr/vr_window_manager/shell_view.cpp @@ -419,7 +419,6 @@ base::unique_fd ShellView::OnFrame(std::unique_ptr<HwcCallback::Frame> frame) { // so give it a kick. if (visibility != ViewMode::Hidden && current_frame_.visibility == ViewMode::Hidden) { - QueueTask(MainThreadTask::EnteringVrMode); QueueTask(MainThreadTask::Show); } |