Add clearDisplayService in IVirtualizationServiceInternal
To clean up previous display service
Bug: 331708504
Test: turn off and then turn on the vm launcher app
Change-Id: Ica340a250d89ed6ed4cc66370cb01db807a0e17b
diff --git a/libs/android_display_backend/crosvm_android_display_client.cpp b/libs/android_display_backend/crosvm_android_display_client.cpp
index 6737453..a16b7f2 100644
--- a/libs/android_display_backend/crosvm_android_display_client.cpp
+++ b/libs/android_display_backend/crosvm_android_display_client.cpp
@@ -134,6 +134,16 @@
LIBEXPORT
void destroy_android_display_context(android_display_log_callback_type error_callback,
struct android_display_context* ctx) {
+ auto service = ::ndk::SharedRefBase::make<DisplayService>();
+ ::ndk::SpAIBinder binder(
+ AServiceManager_waitForService("android.system.virtualizationservice"));
+ auto virt_service = IVirtualizationServiceInternal::fromBinder(binder);
+ if (virt_service != nullptr) {
+ auto status = virt_service->clearDisplayService();
+ } else {
+ ErrorF(error_callback, "Failed to find android.system.virtualizationservice");
+ }
+
if (!ctx) {
ErrorF(error_callback, "Invalid context.");
return;
diff --git a/virtualizationservice/aidl/android/system/virtualizationservice_internal/IVirtualizationServiceInternal.aidl b/virtualizationservice/aidl/android/system/virtualizationservice_internal/IVirtualizationServiceInternal.aidl
index 65806da..84f8734 100644
--- a/virtualizationservice/aidl/android/system/virtualizationservice_internal/IVirtualizationServiceInternal.aidl
+++ b/virtualizationservice/aidl/android/system/virtualizationservice_internal/IVirtualizationServiceInternal.aidl
@@ -119,5 +119,6 @@
// TODO(b/330257000): Remove these functions when a display service is running with binder RPC.
void setDisplayService(IBinder ibinder);
+ void clearDisplayService();
IBinder waitDisplayService();
}
diff --git a/virtualizationservice/src/aidl.rs b/virtualizationservice/src/aidl.rs
index 9258b82..1fa634d 100644
--- a/virtualizationservice/src/aidl.rs
+++ b/virtualizationservice/src/aidl.rs
@@ -205,6 +205,15 @@
Ok(())
}
+ fn clearDisplayService(&self) -> std::result::Result<(), binder::Status> {
+ check_manage_access()?;
+ check_use_custom_virtual_machine()?;
+ let state = &mut *self.state.lock().unwrap();
+ state.display_service = None;
+ self.display_service_set.notify_all();
+ Ok(())
+ }
+
fn waitDisplayService(&self) -> std::result::Result<binder::SpIBinder, binder::Status> {
check_manage_access()?;
check_use_custom_virtual_machine()?;