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: Ibd3ea6bc6751bd65647ff381f9b0124bc3395c09
Merged-In: I7c5127e96d80d077735010d2e62c7227805ccb10
Merged-In: Ibd3ea6bc6751bd65647ff381f9b0124bc3395c09
(cherry picked from commit 72702b979654234c18045f04270040056a74cf90)
This commit is contained in:
Automerger Merge Worker
2020-02-28 03:42:44 +00:00
committed by Mark Chien
parent c9a82f2dfc
commit f90ad41c07

View File

@@ -28,6 +28,7 @@ import android.os.RemoteException;
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 @@ public class EthernetManager {
* @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());
}
};