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()?;