[DRUEL03] Implement unsolicited private DNS validation event

Implement unsolicited private DNS validation event that will
report to the listener when process a private DNS validation
and get result.

Bug: 173485754
Test: atest resolv_integration_test resolv_unit_test\
      resolv_stress_test resolv_stats_test_utils_test
Change-Id: I2b90f4e5ad298e06efbb07c8bcc56808df46fdd0
diff --git a/PrivateDnsConfiguration.cpp b/PrivateDnsConfiguration.cpp
index 8f3b836..c8b070a 100644
--- a/PrivateDnsConfiguration.cpp
+++ b/PrivateDnsConfiguration.cpp
@@ -30,6 +30,8 @@
 #include "netdutils/BackoffSequence.h"
 #include "util.h"
 
+using aidl::android::net::resolv::aidl::IDnsResolverUnsolicitedEventListener;
+using aidl::android::net::resolv::aidl::PrivateDnsValidationEventParcel;
 using android::base::StringPrintf;
 using android::netdutils::setThreadName;
 using std::chrono::milliseconds;
@@ -222,6 +224,35 @@
     validate_thread.detach();
 }
 
+void PrivateDnsConfiguration::sendPrivateDnsValidationEvent(const DnsTlsServer& server,
+                                                            unsigned netId, bool success) {
+    LOG(DEBUG) << "Sending validation " << (success ? "success" : "failure") << " event on netId "
+               << netId << " for " << server.toIpString() << " with hostname {" << server.name
+               << "}";
+    // Send a validation event to NetdEventListenerService.
+    const auto& listeners = ResolverEventReporter::getInstance().getListeners();
+    if (listeners.empty()) {
+        LOG(ERROR)
+                << "Validation event not sent since no INetdEventListener receiver is available.";
+    }
+    for (const auto& it : listeners) {
+        it->onPrivateDnsValidationEvent(netId, server.toIpString(), server.name, success);
+    }
+
+    // Send a validation event to unsolicited event listeners.
+    const auto& unsolEventListeners = ResolverEventReporter::getInstance().getUnsolEventListeners();
+    const PrivateDnsValidationEventParcel validationEvent = {
+            .netId = static_cast<int32_t>(netId),
+            .ipAddress = server.toIpString(),
+            .hostname = server.name,
+            .validation = success ? IDnsResolverUnsolicitedEventListener::VALIDATION_RESULT_SUCCESS
+                                  : IDnsResolverUnsolicitedEventListener::VALIDATION_RESULT_FAILURE,
+    };
+    for (const auto& it : unsolEventListeners) {
+        it->onPrivateDnsValidationEvent(validationEvent);
+    }
+}
+
 bool PrivateDnsConfiguration::recordPrivateDnsValidation(const DnsTlsServer& server, unsigned netId,
                                                          bool success) {
     constexpr bool NEEDS_REEVALUATION = true;
@@ -268,19 +299,8 @@
         reevaluationStatus = DONT_REEVALUATE;
     }
 
-    // Send a validation event to NetdEventListenerService.
-    const auto& listeners = ResolverEventReporter::getInstance().getListeners();
-    if (listeners.size() != 0) {
-        for (const auto& it : listeners) {
-            it->onPrivateDnsValidationEvent(netId, server.toIpString(), server.name, success);
-        }
-        LOG(DEBUG) << "Sent validation " << (success ? "success" : "failure") << " event on netId "
-                   << netId << " for " << server.toIpString() << " with hostname {" << server.name
-                   << "}";
-    } else {
-        LOG(ERROR)
-                << "Validation event not sent since no INetdEventListener receiver is available.";
-    }
+    // Send private dns validation result to listeners.
+    sendPrivateDnsValidationEvent(server, netId, success);
 
     if (success) {
         updateServerState(identity, Validation::success, netId);