Loading api/system-current.txt +6 −0 Original line number Diff line number Diff line Loading @@ -4704,6 +4704,7 @@ package android.net.wifi { method public boolean isPortableHotspotSupported(); method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled(); method public boolean isWifiScannerSupported(); method @RequiresPermission("android.permission.NETWORK_SETTINGS") public void registerSoftApCallback(@NonNull android.net.wifi.WifiManager.SoftApCallback, @Nullable java.util.concurrent.Executor); method @RequiresPermission("android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE") public void removeOnWifiUsabilityStatsListener(@NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener); method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener); method @RequiresPermission("android.permission.WIFI_SET_DEVICE_MOBILITY_STATE") public void setDeviceMobilityState(int); Loading Loading @@ -4762,6 +4763,11 @@ package android.net.wifi { method public void onWifiUsabilityStats(int, boolean, @NonNull android.net.wifi.WifiUsabilityStatsEntry); } public static interface WifiManager.SoftApCallback { method public void onConnectedClientsChanged(@NonNull java.util.List<android.net.wifi.WifiClient>); method public void onStateChanged(int, int); } public class WifiNetworkConnectionStatistics implements android.os.Parcelable { ctor public WifiNetworkConnectionStatistics(int, int); ctor public WifiNetworkConnectionStatistics(); Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java +3 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.ConnectivityManager; import android.net.wifi.WifiClient; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.HandlerExecutor; import android.os.UserManager; import android.util.Log; Loading Loading @@ -109,7 +110,8 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof mCallbacks.add(callback); if (mWifiManager != null) { if (mCallbacks.size() == 1) { mWifiManager.registerSoftApCallback(this, mMainHandler); mWifiManager.registerSoftApCallback(this, new HandlerExecutor(mMainHandler)); } else { // mWifiManager#registerSoftApCallback triggers a call to // onConnectedClientsChanged on the Main Handler. In order to always update Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import java.util.ArrayList; import java.util.concurrent.Executor; @SmallTest @RunWith(AndroidTestingRunner.class) Loading Loading @@ -73,7 +74,7 @@ public class HotspotControllerImplTest extends SysuiTestCase { .onConnectedClientsChanged(new ArrayList<>()); return null; }).when(mWifiManager).registerSoftApCallback(any(WifiManager.SoftApCallback.class), any(Handler.class)); any(Executor.class)); mController = new HotspotControllerImpl(mContext, new Handler(mLooper.getLooper())); } Loading wifi/java/android/net/wifi/WifiManager.java +15 −11 Original line number Diff line number Diff line Loading @@ -3122,6 +3122,7 @@ public class WifiManager { * * @hide */ @SystemApi public interface SoftApCallback { /** * Called when soft AP state changes. Loading Loading @@ -3150,11 +3151,11 @@ public class WifiManager { * @hide */ private class SoftApCallbackProxy extends ISoftApCallback.Stub { private final Handler mHandler; private final Executor mExecutor; private final SoftApCallback mCallback; SoftApCallbackProxy(Looper looper, SoftApCallback callback) { mHandler = new Handler(looper); SoftApCallbackProxy(Executor executor, SoftApCallback callback) { mExecutor = executor; mCallback = callback; } Loading @@ -3165,7 +3166,8 @@ public class WifiManager { + ", failureReason=" + failureReason); } mHandler.post(() -> { Binder.clearCallingIdentity(); mExecutor.execute(() -> { mCallback.onStateChanged(state, failureReason); }); } Loading @@ -3177,7 +3179,8 @@ public class WifiManager { + clients.size() + " clients"); } mHandler.post(() -> { Binder.clearCallingIdentity(); mExecutor.execute(() -> { mCallback.onConnectedClientsChanged(clients); }); } Loading @@ -3196,21 +3199,22 @@ public class WifiManager { * <p> * * @param callback Callback for soft AP events * @param handler The Handler on whose thread to execute the callbacks of the {@code callback} * object. If null, then the application's main thread will be used. * @param executor The executor to execute the callbacks of the {@code executor} * object. If null, then the application's main executor will be used. * * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerSoftApCallback(@NonNull SoftApCallback callback, @Nullable Handler handler) { @Nullable @CallbackExecutor Executor executor) { if (callback == null) throw new IllegalArgumentException("callback cannot be null"); Log.v(TAG, "registerSoftApCallback: callback=" + callback + ", handler=" + handler); Log.v(TAG, "registerSoftApCallback: callback=" + callback + ", executor=" + executor); Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper(); executor = (executor == null) ? mContext.getMainExecutor() : executor; Binder binder = new Binder(); try { mService.registerSoftApCallback(binder, new SoftApCallbackProxy(looper, callback), mService.registerSoftApCallback(binder, new SoftApCallbackProxy(executor, callback), callback.hashCode()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); Loading wifi/tests/src/android/net/wifi/WifiManagerTest.java +10 −9 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ import android.net.wifi.WifiManager.SoftApCallback; import android.net.wifi.WifiManager.TrafficStateCallback; import android.os.Build; import android.os.Handler; import android.os.HandlerExecutor; import android.os.IBinder; import android.os.Message; import android.os.Messenger; Loading Loading @@ -685,7 +686,7 @@ public class WifiManagerTest { @Test public void registerSoftApCallbackThrowsIllegalArgumentExceptionOnNullArgumentForCallback() { try { mWifiManager.registerSoftApCallback(null, mHandler); mWifiManager.registerSoftApCallback(null, new HandlerExecutor(mHandler)); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) { } Loading @@ -710,7 +711,7 @@ public class WifiManagerTest { public void registerSoftApCallbackUsesMainLooperOnNullArgumentForHandler() { when(mContext.getMainLooper()).thenReturn(mLooper.getLooper()); mWifiManager.registerSoftApCallback(mSoftApCallback, null); verify(mContext).getMainLooper(); verify(mContext).getMainExecutor(); } /** Loading @@ -718,7 +719,7 @@ public class WifiManagerTest { */ @Test public void registerSoftApCallbackCallGoesToWifiServiceImpl() throws Exception { mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), any(ISoftApCallback.Stub.class), anyInt()); } Loading @@ -729,7 +730,7 @@ public class WifiManagerTest { @Test public void unregisterSoftApCallbackCallGoesToWifiServiceImpl() throws Exception { ArgumentCaptor<Integer> callbackIdentifier = ArgumentCaptor.forClass(Integer.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), any(ISoftApCallback.Stub.class), callbackIdentifier.capture()); Loading @@ -744,7 +745,7 @@ public class WifiManagerTest { public void softApCallbackProxyCallsOnStateChanged() throws Exception { ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor = ArgumentCaptor.forClass(ISoftApCallback.Stub.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -760,7 +761,7 @@ public class WifiManagerTest { public void softApCallbackProxyCallsOnConnectedClientsChanged() throws Exception { ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor = ArgumentCaptor.forClass(ISoftApCallback.Stub.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -777,7 +778,7 @@ public class WifiManagerTest { public void softApCallbackProxyCallsOnMultipleUpdates() throws Exception { ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor = ArgumentCaptor.forClass(ISoftApCallback.Stub.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -801,7 +802,7 @@ public class WifiManagerTest { ArgumentCaptor.forClass(ISoftApCallback.Stub.class); TestLooper altLooper = new TestLooper(); Handler altHandler = new Handler(altLooper.getLooper()); mWifiManager.registerSoftApCallback(mSoftApCallback, altHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(altHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -815,7 +816,7 @@ public class WifiManagerTest { */ @Test public void testCorrectLooperIsUsedForSoftApCallbackHandler() throws Exception { mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); mLooper.dispatchAll(); verify(mWifiService).registerSoftApCallback(any(IBinder.class), any(ISoftApCallback.Stub.class), anyInt()); Loading Loading
api/system-current.txt +6 −0 Original line number Diff line number Diff line Loading @@ -4704,6 +4704,7 @@ package android.net.wifi { method public boolean isPortableHotspotSupported(); method @RequiresPermission(android.Manifest.permission.ACCESS_WIFI_STATE) public boolean isWifiApEnabled(); method public boolean isWifiScannerSupported(); method @RequiresPermission("android.permission.NETWORK_SETTINGS") public void registerSoftApCallback(@NonNull android.net.wifi.WifiManager.SoftApCallback, @Nullable java.util.concurrent.Executor); method @RequiresPermission("android.permission.WIFI_UPDATE_USABILITY_STATS_SCORE") public void removeOnWifiUsabilityStatsListener(@NonNull android.net.wifi.WifiManager.OnWifiUsabilityStatsListener); method @RequiresPermission(anyOf={"android.permission.NETWORK_SETTINGS", android.Manifest.permission.NETWORK_SETUP_WIZARD, "android.permission.NETWORK_STACK"}) public void save(@NonNull android.net.wifi.WifiConfiguration, @Nullable android.net.wifi.WifiManager.ActionListener); method @RequiresPermission("android.permission.WIFI_SET_DEVICE_MOBILITY_STATE") public void setDeviceMobilityState(int); Loading Loading @@ -4762,6 +4763,11 @@ package android.net.wifi { method public void onWifiUsabilityStats(int, boolean, @NonNull android.net.wifi.WifiUsabilityStatsEntry); } public static interface WifiManager.SoftApCallback { method public void onConnectedClientsChanged(@NonNull java.util.List<android.net.wifi.WifiClient>); method public void onStateChanged(int, int); } public class WifiNetworkConnectionStatistics implements android.os.Parcelable { ctor public WifiNetworkConnectionStatistics(int, int); ctor public WifiNetworkConnectionStatistics(); Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/HotspotControllerImpl.java +3 −1 Original line number Diff line number Diff line Loading @@ -24,6 +24,7 @@ import android.net.ConnectivityManager; import android.net.wifi.WifiClient; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.HandlerExecutor; import android.os.UserManager; import android.util.Log; Loading Loading @@ -109,7 +110,8 @@ public class HotspotControllerImpl implements HotspotController, WifiManager.Sof mCallbacks.add(callback); if (mWifiManager != null) { if (mCallbacks.size() == 1) { mWifiManager.registerSoftApCallback(this, mMainHandler); mWifiManager.registerSoftApCallback(this, new HandlerExecutor(mMainHandler)); } else { // mWifiManager#registerSoftApCallback triggers a call to // onConnectedClientsChanged on the Main Handler. In order to always update Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/HotspotControllerImplTest.java +2 −1 Original line number Diff line number Diff line Loading @@ -43,6 +43,7 @@ import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import java.util.ArrayList; import java.util.concurrent.Executor; @SmallTest @RunWith(AndroidTestingRunner.class) Loading Loading @@ -73,7 +74,7 @@ public class HotspotControllerImplTest extends SysuiTestCase { .onConnectedClientsChanged(new ArrayList<>()); return null; }).when(mWifiManager).registerSoftApCallback(any(WifiManager.SoftApCallback.class), any(Handler.class)); any(Executor.class)); mController = new HotspotControllerImpl(mContext, new Handler(mLooper.getLooper())); } Loading
wifi/java/android/net/wifi/WifiManager.java +15 −11 Original line number Diff line number Diff line Loading @@ -3122,6 +3122,7 @@ public class WifiManager { * * @hide */ @SystemApi public interface SoftApCallback { /** * Called when soft AP state changes. Loading Loading @@ -3150,11 +3151,11 @@ public class WifiManager { * @hide */ private class SoftApCallbackProxy extends ISoftApCallback.Stub { private final Handler mHandler; private final Executor mExecutor; private final SoftApCallback mCallback; SoftApCallbackProxy(Looper looper, SoftApCallback callback) { mHandler = new Handler(looper); SoftApCallbackProxy(Executor executor, SoftApCallback callback) { mExecutor = executor; mCallback = callback; } Loading @@ -3165,7 +3166,8 @@ public class WifiManager { + ", failureReason=" + failureReason); } mHandler.post(() -> { Binder.clearCallingIdentity(); mExecutor.execute(() -> { mCallback.onStateChanged(state, failureReason); }); } Loading @@ -3177,7 +3179,8 @@ public class WifiManager { + clients.size() + " clients"); } mHandler.post(() -> { Binder.clearCallingIdentity(); mExecutor.execute(() -> { mCallback.onConnectedClientsChanged(clients); }); } Loading @@ -3196,21 +3199,22 @@ public class WifiManager { * <p> * * @param callback Callback for soft AP events * @param handler The Handler on whose thread to execute the callbacks of the {@code callback} * object. If null, then the application's main thread will be used. * @param executor The executor to execute the callbacks of the {@code executor} * object. If null, then the application's main executor will be used. * * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.NETWORK_SETTINGS) public void registerSoftApCallback(@NonNull SoftApCallback callback, @Nullable Handler handler) { @Nullable @CallbackExecutor Executor executor) { if (callback == null) throw new IllegalArgumentException("callback cannot be null"); Log.v(TAG, "registerSoftApCallback: callback=" + callback + ", handler=" + handler); Log.v(TAG, "registerSoftApCallback: callback=" + callback + ", executor=" + executor); Looper looper = (handler == null) ? mContext.getMainLooper() : handler.getLooper(); executor = (executor == null) ? mContext.getMainExecutor() : executor; Binder binder = new Binder(); try { mService.registerSoftApCallback(binder, new SoftApCallbackProxy(looper, callback), mService.registerSoftApCallback(binder, new SoftApCallbackProxy(executor, callback), callback.hashCode()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); Loading
wifi/tests/src/android/net/wifi/WifiManagerTest.java +10 −9 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ import android.net.wifi.WifiManager.SoftApCallback; import android.net.wifi.WifiManager.TrafficStateCallback; import android.os.Build; import android.os.Handler; import android.os.HandlerExecutor; import android.os.IBinder; import android.os.Message; import android.os.Messenger; Loading Loading @@ -685,7 +686,7 @@ public class WifiManagerTest { @Test public void registerSoftApCallbackThrowsIllegalArgumentExceptionOnNullArgumentForCallback() { try { mWifiManager.registerSoftApCallback(null, mHandler); mWifiManager.registerSoftApCallback(null, new HandlerExecutor(mHandler)); fail("expected IllegalArgumentException"); } catch (IllegalArgumentException expected) { } Loading @@ -710,7 +711,7 @@ public class WifiManagerTest { public void registerSoftApCallbackUsesMainLooperOnNullArgumentForHandler() { when(mContext.getMainLooper()).thenReturn(mLooper.getLooper()); mWifiManager.registerSoftApCallback(mSoftApCallback, null); verify(mContext).getMainLooper(); verify(mContext).getMainExecutor(); } /** Loading @@ -718,7 +719,7 @@ public class WifiManagerTest { */ @Test public void registerSoftApCallbackCallGoesToWifiServiceImpl() throws Exception { mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), any(ISoftApCallback.Stub.class), anyInt()); } Loading @@ -729,7 +730,7 @@ public class WifiManagerTest { @Test public void unregisterSoftApCallbackCallGoesToWifiServiceImpl() throws Exception { ArgumentCaptor<Integer> callbackIdentifier = ArgumentCaptor.forClass(Integer.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), any(ISoftApCallback.Stub.class), callbackIdentifier.capture()); Loading @@ -744,7 +745,7 @@ public class WifiManagerTest { public void softApCallbackProxyCallsOnStateChanged() throws Exception { ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor = ArgumentCaptor.forClass(ISoftApCallback.Stub.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -760,7 +761,7 @@ public class WifiManagerTest { public void softApCallbackProxyCallsOnConnectedClientsChanged() throws Exception { ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor = ArgumentCaptor.forClass(ISoftApCallback.Stub.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -777,7 +778,7 @@ public class WifiManagerTest { public void softApCallbackProxyCallsOnMultipleUpdates() throws Exception { ArgumentCaptor<ISoftApCallback.Stub> callbackCaptor = ArgumentCaptor.forClass(ISoftApCallback.Stub.class); mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -801,7 +802,7 @@ public class WifiManagerTest { ArgumentCaptor.forClass(ISoftApCallback.Stub.class); TestLooper altLooper = new TestLooper(); Handler altHandler = new Handler(altLooper.getLooper()); mWifiManager.registerSoftApCallback(mSoftApCallback, altHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(altHandler)); verify(mWifiService).registerSoftApCallback(any(IBinder.class), callbackCaptor.capture(), anyInt()); Loading @@ -815,7 +816,7 @@ public class WifiManagerTest { */ @Test public void testCorrectLooperIsUsedForSoftApCallbackHandler() throws Exception { mWifiManager.registerSoftApCallback(mSoftApCallback, mHandler); mWifiManager.registerSoftApCallback(mSoftApCallback, new HandlerExecutor(mHandler)); mLooper.dispatchAll(); verify(mWifiService).registerSoftApCallback(any(IBinder.class), any(ISoftApCallback.Stub.class), anyInt()); Loading