Merge "Marking SoftApCallback methods as SystemAPI"
am: 8295ffc5af
Change-Id: I9cb5c54a206f9e92a321fa438640329c1f8f8a60
This commit is contained in:
@@ -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);
|
||||
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
@@ -3121,6 +3121,7 @@ public class WifiManager {
|
||||
*
|
||||
* @hide
|
||||
*/
|
||||
@SystemApi
|
||||
public interface SoftApCallback {
|
||||
/**
|
||||
* Called when soft AP state changes.
|
||||
@@ -3149,11 +3150,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;
|
||||
}
|
||||
|
||||
@@ -3164,7 +3165,8 @@ public class WifiManager {
|
||||
+ ", failureReason=" + failureReason);
|
||||
}
|
||||
|
||||
mHandler.post(() -> {
|
||||
Binder.clearCallingIdentity();
|
||||
mExecutor.execute(() -> {
|
||||
mCallback.onStateChanged(state, failureReason);
|
||||
});
|
||||
}
|
||||
@@ -3176,7 +3178,8 @@ public class WifiManager {
|
||||
+ clients.size() + " clients");
|
||||
}
|
||||
|
||||
mHandler.post(() -> {
|
||||
Binder.clearCallingIdentity();
|
||||
mExecutor.execute(() -> {
|
||||
mCallback.onConnectedClientsChanged(clients);
|
||||
});
|
||||
}
|
||||
@@ -3195,21 +3198,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();
|
||||
|
||||
@@ -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;
|
||||
@@ -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) {
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -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());
|
||||
}
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user