Loading api/system-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -6128,7 +6128,7 @@ package android.net { } public class EthernetManager { method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull android.net.EthernetManager.TetheredInterfaceCallback); method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback); } public static interface EthernetManager.TetheredInterfaceCallback { Loading api/test-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -1727,7 +1727,7 @@ package android.net { } public class EthernetManager { method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull android.net.EthernetManager.TetheredInterfaceCallback); method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback); } public static interface EthernetManager.TetheredInterfaceCallback { Loading core/java/android/net/EthernetManager.java +6 −4 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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()); } }; Loading packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java +11 −9 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ public class Tethering { private final UserRestrictionActionListener mTetheringRestriction; private final ActiveDataSubIdListener mActiveDataSubIdListener; private final ConnectedClientsTracker mConnectedClientsTracker; private final TetheringThreadExecutor mExecutor; private int mActiveDataSubId = INVALID_SUBSCRIPTION_ID; // All the usage of mTetheringEventCallback should run in the same thread. private ITetheringEventCallback mTetheringEventCallback = null; Loading Loading @@ -296,8 +297,8 @@ public class Tethering { final UserManager userManager = (UserManager) mContext.getSystemService( Context.USER_SERVICE); mTetheringRestriction = new UserRestrictionActionListener(userManager, this); final TetheringThreadExecutor executor = new TetheringThreadExecutor(mHandler); mActiveDataSubIdListener = new ActiveDataSubIdListener(executor); mExecutor = new TetheringThreadExecutor(mHandler); mActiveDataSubIdListener = new ActiveDataSubIdListener(mExecutor); // Load tethering configuration. updateConfiguration(); Loading @@ -315,9 +316,7 @@ public class Tethering { final WifiManager wifiManager = getWifiManager(); if (wifiManager != null) { wifiManager.registerSoftApCallback( mHandler::post /* executor */, new TetheringSoftApCallback()); wifiManager.registerSoftApCallback(mExecutor, new TetheringSoftApCallback()); } } Loading Loading @@ -606,14 +605,17 @@ public class Tethering { Context.ETHERNET_SERVICE); synchronized (mPublicSync) { if (enable) { if (mEthernetCallback != null) return TETHER_ERROR_NO_ERROR; mEthernetCallback = new EthernetCallback(); mEthernetIfaceRequest = em.requestTetheredInterface(mEthernetCallback); mEthernetIfaceRequest = em.requestTetheredInterface(mExecutor, mEthernetCallback); } else { if (mConfiguredEthernetIface != null) { stopEthernetTetheringLocked(); if (mEthernetCallback != null) { mEthernetIfaceRequest.release(); } mEthernetCallback = null; mEthernetIfaceRequest = null; } } } return TETHER_ERROR_NO_ERROR; Loading packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java +23 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED; import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY; import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER; import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER; import static android.net.TetheringManager.TETHERING_ETHERNET; import static android.net.TetheringManager.TETHERING_NCM; import static android.net.TetheringManager.TETHERING_USB; import static android.net.TetheringManager.TETHERING_WIFI; Loading Loading @@ -75,6 +76,8 @@ import android.content.pm.ApplicationInfo; import android.content.res.Resources; import android.hardware.usb.UsbManager; import android.net.ConnectivityManager; import android.net.EthernetManager; import android.net.EthernetManager.TetheredInterfaceRequest; import android.net.INetd; import android.net.ITetheringEventCallback; import android.net.InetAddresses; Loading Loading @@ -180,6 +183,7 @@ public class TetheringTest { @Mock private UserManager mUserManager; @Mock private NetworkRequest mNetworkRequest; @Mock private ConnectivityManager mCm; @Mock private EthernetManager mEm; private final MockIpServerDependencies mIpServerDependencies = spy(new MockIpServerDependencies()); Loading Loading @@ -232,6 +236,7 @@ public class TetheringTest { if (Context.USER_SERVICE.equals(name)) return mUserManager; if (Context.NETWORK_STATS_SERVICE.equals(name)) return mStatsManager; if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm; if (Context.ETHERNET_SERVICE.equals(name)) return mEm; return super.getSystemService(name); } Loading Loading @@ -1316,6 +1321,24 @@ public class TetheringTest { assertEquals(fakeSubId, newConfig.activeDataSubId); } @Test public void testNoDuplicatedEthernetRequest() throws Exception { final TetheredInterfaceRequest mockRequest = mock(TetheredInterfaceRequest.class); when(mEm.requestTetheredInterface(any(), any())).thenReturn(mockRequest); mTethering.startTethering(createTetheringRquestParcel(TETHERING_ETHERNET), null); mLooper.dispatchAll(); verify(mEm, times(1)).requestTetheredInterface(any(), any()); mTethering.startTethering(createTetheringRquestParcel(TETHERING_ETHERNET), null); mLooper.dispatchAll(); verifyNoMoreInteractions(mEm); mTethering.stopTethering(TETHERING_ETHERNET); mLooper.dispatchAll(); verify(mockRequest, times(1)).release(); mTethering.stopTethering(TETHERING_ETHERNET); mLooper.dispatchAll(); verifyNoMoreInteractions(mEm); } private void workingWifiP2pGroupOwner( boolean emulateInterfaceStatusChanged) throws Exception { if (emulateInterfaceStatusChanged) { Loading Loading
api/system-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -6128,7 +6128,7 @@ package android.net { } public class EthernetManager { method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull android.net.EthernetManager.TetheredInterfaceCallback); method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback); } public static interface EthernetManager.TetheredInterfaceCallback { Loading
api/test-current.txt +1 −1 Original line number Diff line number Diff line Loading @@ -1727,7 +1727,7 @@ package android.net { } public class EthernetManager { method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull android.net.EthernetManager.TetheredInterfaceCallback); method @NonNull public android.net.EthernetManager.TetheredInterfaceRequest requestTetheredInterface(@NonNull java.util.concurrent.Executor, @NonNull android.net.EthernetManager.TetheredInterfaceCallback); } public static interface EthernetManager.TetheredInterfaceCallback { Loading
core/java/android/net/EthernetManager.java +6 −4 Original line number Diff line number Diff line Loading @@ -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. Loading Loading @@ -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()); } }; Loading
packages/Tethering/src/com/android/server/connectivity/tethering/Tethering.java +11 −9 Original line number Diff line number Diff line Loading @@ -220,6 +220,7 @@ public class Tethering { private final UserRestrictionActionListener mTetheringRestriction; private final ActiveDataSubIdListener mActiveDataSubIdListener; private final ConnectedClientsTracker mConnectedClientsTracker; private final TetheringThreadExecutor mExecutor; private int mActiveDataSubId = INVALID_SUBSCRIPTION_ID; // All the usage of mTetheringEventCallback should run in the same thread. private ITetheringEventCallback mTetheringEventCallback = null; Loading Loading @@ -296,8 +297,8 @@ public class Tethering { final UserManager userManager = (UserManager) mContext.getSystemService( Context.USER_SERVICE); mTetheringRestriction = new UserRestrictionActionListener(userManager, this); final TetheringThreadExecutor executor = new TetheringThreadExecutor(mHandler); mActiveDataSubIdListener = new ActiveDataSubIdListener(executor); mExecutor = new TetheringThreadExecutor(mHandler); mActiveDataSubIdListener = new ActiveDataSubIdListener(mExecutor); // Load tethering configuration. updateConfiguration(); Loading @@ -315,9 +316,7 @@ public class Tethering { final WifiManager wifiManager = getWifiManager(); if (wifiManager != null) { wifiManager.registerSoftApCallback( mHandler::post /* executor */, new TetheringSoftApCallback()); wifiManager.registerSoftApCallback(mExecutor, new TetheringSoftApCallback()); } } Loading Loading @@ -606,14 +605,17 @@ public class Tethering { Context.ETHERNET_SERVICE); synchronized (mPublicSync) { if (enable) { if (mEthernetCallback != null) return TETHER_ERROR_NO_ERROR; mEthernetCallback = new EthernetCallback(); mEthernetIfaceRequest = em.requestTetheredInterface(mEthernetCallback); mEthernetIfaceRequest = em.requestTetheredInterface(mExecutor, mEthernetCallback); } else { if (mConfiguredEthernetIface != null) { stopEthernetTetheringLocked(); if (mEthernetCallback != null) { mEthernetIfaceRequest.release(); } mEthernetCallback = null; mEthernetIfaceRequest = null; } } } return TETHER_ERROR_NO_ERROR; Loading
packages/Tethering/tests/unit/src/com/android/server/connectivity/tethering/TetheringTest.java +23 −0 Original line number Diff line number Diff line Loading @@ -28,6 +28,7 @@ import static android.net.TetheringManager.ACTION_TETHER_STATE_CHANGED; import static android.net.TetheringManager.EXTRA_ACTIVE_LOCAL_ONLY; import static android.net.TetheringManager.EXTRA_ACTIVE_TETHER; import static android.net.TetheringManager.EXTRA_AVAILABLE_TETHER; import static android.net.TetheringManager.TETHERING_ETHERNET; import static android.net.TetheringManager.TETHERING_NCM; import static android.net.TetheringManager.TETHERING_USB; import static android.net.TetheringManager.TETHERING_WIFI; Loading Loading @@ -75,6 +76,8 @@ import android.content.pm.ApplicationInfo; import android.content.res.Resources; import android.hardware.usb.UsbManager; import android.net.ConnectivityManager; import android.net.EthernetManager; import android.net.EthernetManager.TetheredInterfaceRequest; import android.net.INetd; import android.net.ITetheringEventCallback; import android.net.InetAddresses; Loading Loading @@ -180,6 +183,7 @@ public class TetheringTest { @Mock private UserManager mUserManager; @Mock private NetworkRequest mNetworkRequest; @Mock private ConnectivityManager mCm; @Mock private EthernetManager mEm; private final MockIpServerDependencies mIpServerDependencies = spy(new MockIpServerDependencies()); Loading Loading @@ -232,6 +236,7 @@ public class TetheringTest { if (Context.USER_SERVICE.equals(name)) return mUserManager; if (Context.NETWORK_STATS_SERVICE.equals(name)) return mStatsManager; if (Context.CONNECTIVITY_SERVICE.equals(name)) return mCm; if (Context.ETHERNET_SERVICE.equals(name)) return mEm; return super.getSystemService(name); } Loading Loading @@ -1316,6 +1321,24 @@ public class TetheringTest { assertEquals(fakeSubId, newConfig.activeDataSubId); } @Test public void testNoDuplicatedEthernetRequest() throws Exception { final TetheredInterfaceRequest mockRequest = mock(TetheredInterfaceRequest.class); when(mEm.requestTetheredInterface(any(), any())).thenReturn(mockRequest); mTethering.startTethering(createTetheringRquestParcel(TETHERING_ETHERNET), null); mLooper.dispatchAll(); verify(mEm, times(1)).requestTetheredInterface(any(), any()); mTethering.startTethering(createTetheringRquestParcel(TETHERING_ETHERNET), null); mLooper.dispatchAll(); verifyNoMoreInteractions(mEm); mTethering.stopTethering(TETHERING_ETHERNET); mLooper.dispatchAll(); verify(mockRequest, times(1)).release(); mTethering.stopTethering(TETHERING_ETHERNET); mLooper.dispatchAll(); verifyNoMoreInteractions(mEm); } private void workingWifiP2pGroupOwner( boolean emulateInterfaceStatusChanged) throws Exception { if (emulateInterfaceStatusChanged) { Loading