Fix crash and duplicated ethernet tethering request

This change fix two things:
1. Handle ethernet callback in internal thread to avoid crash. IpServer
should be created from tethering thread, otherwise mIpNeighborMonitor of
IpServer would throw
   IllegalStateException("start() called from off-thread")
2. Ethernet tethering request may be duplicated if multiple
startTethering is called but no stopTethering

Bug: 130840861
Bug: 148824036
Test: ON/OFF ethernet tehtering manually
      atest TetheringTests

Change-Id: I7c5127e96d80d077735010d2e62c7227805ccb10
diff --git a/core/java/android/net/EthernetManager.java b/core/java/android/net/EthernetManager.java
index a3899b7..139f5be 100644
--- a/core/java/android/net/EthernetManager.java
+++ b/core/java/android/net/EthernetManager.java
@@ -28,6 +28,7 @@
 
 import java.util.ArrayList;
 import java.util.Objects;
+import java.util.concurrent.Executor;
 
 /**
  * A class representing the IP configuration of the Ethernet network.
@@ -248,18 +249,19 @@
      * @param callback A callback to be called once the request has been fulfilled.
      */
     @NonNull
-    public TetheredInterfaceRequest requestTetheredInterface(
-            @NonNull TetheredInterfaceCallback callback) {
+    public TetheredInterfaceRequest requestTetheredInterface(@NonNull final Executor executor,
+            @NonNull final TetheredInterfaceCallback callback) {
         Objects.requireNonNull(callback, "Callback must be non-null");
+        Objects.requireNonNull(executor, "Executor must be non-null");
         final ITetheredInterfaceCallback cbInternal = new ITetheredInterfaceCallback.Stub() {
             @Override
             public void onAvailable(String iface) {
-                callback.onAvailable(iface);
+                executor.execute(() -> callback.onAvailable(iface));
             }
 
             @Override
             public void onUnavailable() {
-                callback.onUnavailable();
+                executor.execute(() -> callback.onUnavailable());
             }
         };