summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Jiang <qiangjiang@google.com>2019-11-25 23:38:41 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2019-11-25 23:38:41 +0000
commit7e16d83a042460415830ddda766f36b3c50e4766 (patch)
tree07889f39eb74ae7006e0807e4a65fbff744a887a
parentf52c98e12af4bec3303d786dd9dc1af3c8d87622 (diff)
parent60d3492416526fae3e4582321faecd918ebe678f (diff)
Merge "User binder as callback identifier"
-rw-r--r--service/java/com/android/server/wifi/ScanRequestProxy.java52
-rw-r--r--service/java/com/android/server/wifi/WifiServiceImpl.java30
-rw-r--r--tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java68
-rw-r--r--tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java43
4 files changed, 78 insertions, 115 deletions
diff --git a/service/java/com/android/server/wifi/ScanRequestProxy.java b/service/java/com/android/server/wifi/ScanRequestProxy.java
index 9ba112536..9decba06a 100644
--- a/service/java/com/android/server/wifi/ScanRequestProxy.java
+++ b/service/java/com/android/server/wifi/ScanRequestProxy.java
@@ -22,12 +22,12 @@ import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
-import android.net.wifi.IScanResultsListener;
+import android.net.wifi.IScanResultsCallback;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
import android.os.Handler;
-import android.os.IBinder;
+import android.os.RemoteCallbackList;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.WorkSource;
@@ -37,7 +37,6 @@ import android.util.Log;
import android.util.Pair;
import com.android.internal.annotations.VisibleForTesting;
-import com.android.server.wifi.util.ExternalCallbackTracker;
import com.android.server.wifi.util.WifiPermissionsUtil;
import java.util.ArrayList;
@@ -107,8 +106,8 @@ public class ScanRequestProxy {
new ArrayMap();
// Scan results cached from the last full single scan request.
private final List<ScanResult> mLastScanResults = new ArrayList<>();
- // external ScanResultListener tracker
- private final ExternalCallbackTracker<IScanResultsListener> mRegisteredScanResultsListeners;
+ // external ScanResultCallback tracker
+ private final RemoteCallbackList<IScanResultsCallback> mRegisteredScanResultsCallbacks;
// Global scan listener for listening to all scan requests.
private class GlobalScanListener implements WifiScanner.ScanListener {
@Override
@@ -143,7 +142,7 @@ public class ScanRequestProxy {
mLastScanResults.clear();
mLastScanResults.addAll(Arrays.asList(scanResults));
sendScanResultBroadcast(true);
- sendScanResultsAvailableToListeners();
+ sendScanResultsAvailableToCallbacks();
}
}
@@ -251,7 +250,7 @@ public class ScanRequestProxy {
mClock = clock;
mFrameworkFacade = frameworkFacade;
mThrottleEnabledSettingObserver = new ThrottleEnabledSettingObserver(handler);
- mRegisteredScanResultsListeners = new ExternalCallbackTracker<>(handler);
+ mRegisteredScanResultsCallbacks = new RemoteCallbackList<>();
}
/**
@@ -537,36 +536,31 @@ public class ScanRequestProxy {
mLastScanTimestampsForFgApps.remove(Pair.create(uid, packageName));
}
- private void sendScanResultsAvailableToListeners() {
- Iterator<IScanResultsListener> iterator =
- mRegisteredScanResultsListeners.getCallbacks().iterator();
- while (iterator.hasNext()) {
- IScanResultsListener listener = iterator.next();
- try {
- listener.onScanResultsAvailable();
- } catch (RemoteException e) {
- Log.e(TAG, "onScanResultsAvailable: remote exception -- " + e);
- }
- }
+ private void sendScanResultsAvailableToCallbacks() {
+ mRegisteredScanResultsCallbacks.broadcast(
+ iScanResultsCallback -> {
+ try {
+ iScanResultsCallback.onScanResultsAvailable();
+ } catch (RemoteException e) {
+ Log.e(TAG, "onScanResultsAvailable: remote exception -- " + e);
+ }
+ });
}
/**
- * Register a listener on scan event
- * @param binder IBinder instance to allow cleanup if the app dies.
- * @param listener IScanResultListener instance to add.
- * @param listenerIdentifier identifier of the listener, should be hash code of package name.
+ * Register a callback on scan event
+ * @param callback IScanResultListener instance to add.
* @return true if succeed otherwise false.
*/
- public boolean registerScanResultsListener(IBinder binder, IScanResultsListener listener,
- int listenerIdentifier) {
- return mRegisteredScanResultsListeners.add(binder, listener, listenerIdentifier);
+ public boolean registerScanResultsCallback(IScanResultsCallback callback) {
+ return mRegisteredScanResultsCallbacks.register(callback);
}
/**
- * Unregister a listener on scan event
- * @param listenerIdentifier identifier of the listener, should be hash code of package name.
+ * Unregister a callback on scan event
+ * @param callback IScanResultListener instance to add.
*/
- public void unregisterScanResultsListener(int listenerIdentifier) {
- mRegisteredScanResultsListeners.remove(listenerIdentifier);
+ public void unregisterScanResultsCallback(IScanResultsCallback callback) {
+ mRegisteredScanResultsCallbacks.unregister(callback);
}
}
diff --git a/service/java/com/android/server/wifi/WifiServiceImpl.java b/service/java/com/android/server/wifi/WifiServiceImpl.java
index 6245a3cf9..c8a445fa3 100644
--- a/service/java/com/android/server/wifi/WifiServiceImpl.java
+++ b/service/java/com/android/server/wifi/WifiServiceImpl.java
@@ -53,7 +53,7 @@ import android.net.wifi.IDppCallback;
import android.net.wifi.ILocalOnlyHotspotCallback;
import android.net.wifi.INetworkRequestMatchCallback;
import android.net.wifi.IOnWifiUsabilityStatsListener;
-import android.net.wifi.IScanResultsListener;
+import android.net.wifi.IScanResultsCallback;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.ISuggestionConnectionStatusListener;
import android.net.wifi.ITrafficStateCallback;
@@ -3485,41 +3485,35 @@ public class WifiServiceImpl extends BaseWifiService {
}
/**
- * See {@link WifiManager#addScanResultsListener(Executor, WifiManager.ScanResultsListener)}
+ * See {@link WifiManager#registerScanResultsCallback(WifiManager.ScanResultsCallback)}
*/
- public void registerScanResultsListener(IBinder binder, @NonNull IScanResultsListener listener,
- int listenerIdentifier) {
- if (binder == null) {
- throw new IllegalArgumentException("Binder must not be null");
- }
- if (listener == null) {
- throw new IllegalArgumentException("listener must not be null");
+ public void registerScanResultsCallback(@NonNull IScanResultsCallback callback) {
+ if (callback == null) {
+ throw new IllegalArgumentException("callback must not be null");
}
enforceAccessPermission();
if (mVerboseLoggingEnabled) {
- mLog.info("registerScanResultListener uid=%").c(Binder.getCallingUid()).flush();
+ mLog.info("registerScanResultsCallback uid=%").c(Binder.getCallingUid()).flush();
}
mWifiThreadRunner.post(() -> {
- if (!mWifiInjector.getScanRequestProxy().registerScanResultsListener(binder, listener,
- listenerIdentifier)) {
- Log.e(TAG, "registerScanResultListener: Failed to add callback");
+ if (!mWifiInjector.getScanRequestProxy().registerScanResultsCallback(callback)) {
+ Log.e(TAG, "registerScanResultsCallback: Failed to register callback");
}
});
}
/**
- * See {@link WifiManager#removeScanResultsListener(WifiManager.ScanResultsListener)}
+ * See {@link WifiManager#registerScanResultsCallback(WifiManager.ScanResultsCallback)}
*/
- public void unregisterScanResultsListener(int listenerIdentifier) {
+ public void unregisterScanResultsCallback(@NonNull IScanResultsCallback callback) {
if (mVerboseLoggingEnabled) {
mLog.info("unregisterScanResultCallback uid=%").c(Binder.getCallingUid()).flush();
}
enforceAccessPermission();
// post operation to handler thread
- mWifiThreadRunner.post(() ->
- mWifiInjector.getScanRequestProxy()
- .unregisterScanResultsListener(listenerIdentifier));
+ mWifiThreadRunner.post(() -> mWifiInjector.getScanRequestProxy()
+ .unregisterScanResultsCallback(callback));
}
diff --git a/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java b/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java
index 33de69106..0e5cbd592 100644
--- a/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ScanRequestProxyTest.java
@@ -29,11 +29,10 @@ import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
import android.database.ContentObserver;
-import android.net.wifi.IScanResultsListener;
+import android.net.wifi.IScanResultsCallback;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiScanner;
-import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.UserHandle;
@@ -87,8 +86,8 @@ public class ScanRequestProxyTest extends WifiBaseTest {
@Mock private Clock mClock;
@Mock private FrameworkFacade mFrameworkFacade;
@Mock private WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
- @Mock private IScanResultsListener mScanResultsListener;
- @Mock private IScanResultsListener mAnotherScanResultsListener;
+ @Mock private IScanResultsCallback mScanResultsCallback;
+ @Mock private IScanResultsCallback mAnotherScanResultsCallback;
@Mock private TestLooper mLooper;
@Mock private IBinder mBinder;
@Mock private IBinder mAnotherBinder;
@@ -146,6 +145,8 @@ public class ScanRequestProxyTest extends WifiBaseTest {
new ScanRequestProxy(mContext, mAppOps, mActivityManager, mWifiInjector,
mWifiConfigManager, mWifiPermissionsUtil, mWifiMetrics, mClock,
mFrameworkFacade, new Handler(mLooper.getLooper()));
+ when(mScanResultsCallback.asBinder()).thenReturn(mBinder);
+ when(mAnotherScanResultsCallback.asBinder()).thenReturn(mAnotherBinder);
}
@After
@@ -957,85 +958,68 @@ public class ScanRequestProxyTest extends WifiBaseTest {
}
/**
- * Test register two different scan result listener, all of them will receive the event.
+ * Test register two different scan result Callback, all of them will receive the event.
*/
@Test
- public void testScanSuccessWithMultipleListener() throws Exception {
- Binder binder1 = new Binder();
- Binder binder2 = new Binder();
- mScanRequestProxy.registerScanResultsListener(binder1, mScanResultsListener,
- mScanResultsListener.hashCode());
- mScanRequestProxy.registerScanResultsListener(binder2, mAnotherScanResultsListener,
- mAnotherScanResultsListener.hashCode());
- mLooper.dispatchAll();
+ public void testScanSuccessWithMultipleCallback() throws Exception {
+ mScanRequestProxy.registerScanResultsCallback(mScanResultsCallback);
+ mScanRequestProxy.registerScanResultsCallback(mAnotherScanResultsCallback);
testStartScanSuccess();
// Verify the scan results processing.
mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
mLooper.dispatchAll();
- verify(mScanResultsListener).onScanResultsAvailable();
- verify(mAnotherScanResultsListener).onScanResultsAvailable();
validateScanResultsAvailableBroadcastSent(true);
- reset(mScanResultsListener);
- reset(mAnotherScanResultsListener);
- mScanRequestProxy.unregisterScanResultsListener(mScanResultsListener.hashCode());
- mLooper.dispatchAll();
- mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
+ mScanRequestProxy.unregisterScanResultsCallback(mScanResultsCallback);
+ mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas2);
mLooper.dispatchAll();
- verify(mScanResultsListener, never()).onScanResultsAvailable();
- verify(mAnotherScanResultsListener).onScanResultsAvailable();
validateScanResultsAvailableBroadcastSent(true);
+ verify(mScanResultsCallback).onScanResultsAvailable();
+ verify(mAnotherScanResultsCallback, times(2)).onScanResultsAvailable();
}
/**
- * Verify that registering twice with same listenerIdentifier will replace the first listener.
+ * Verify that registering twice with same Callback will replace the first Callback.
*/
@Test
- public void testReplacesOldListenerWithNewListenerWhenRegisteringTwice() throws Exception {
- mScanRequestProxy.registerScanResultsListener(mBinder, mScanResultsListener,
- mScanResultsListener.hashCode());
- mScanRequestProxy.registerScanResultsListener(mAnotherBinder, mAnotherScanResultsListener,
- mScanResultsListener.hashCode());
+ public void testReplacesOldListenerWithNewCallbackWhenRegisteringTwice() throws Exception {
+ mScanRequestProxy.registerScanResultsCallback(mScanResultsCallback);
+ mScanRequestProxy.registerScanResultsCallback(mScanResultsCallback);
mLooper.dispatchAll();
// Verify old listener is replaced.
- verify(mBinder).linkToDeath(any(), anyInt());
+ verify(mBinder, times(2)).linkToDeath(any(), anyInt());
verify(mBinder).unlinkToDeath(any(), anyInt());
- verify(mAnotherBinder).linkToDeath(any(), anyInt());
- verify(mAnotherBinder, never()).unlinkToDeath(any(), anyInt());
testStartScanSuccess();
// Verify the scan results processing.
mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
mLooper.dispatchAll();
- verify(mScanResultsListener, never()).onScanResultsAvailable();
- verify(mAnotherScanResultsListener).onScanResultsAvailable();
+ verify(mScanResultsCallback).onScanResultsAvailable();
validateScanResultsAvailableBroadcastSent(true);
}
/**
- * Test registered scan result listener will be unregistered when calling binder is died.
+ * Test registered scan result Callback will be unregistered when calling binder is died.
*/
@Test
- public void testUnregisterScanResultListenerOnBinderDied() throws Exception {
- final int callbackIdentifier = 1;
+ public void testUnregisterScanResultCallbackOnBinderDied() throws Exception {
ArgumentCaptor<IBinder.DeathRecipient> drCaptor =
ArgumentCaptor.forClass(IBinder.DeathRecipient.class);
- mScanRequestProxy.registerScanResultsListener(mBinder, mScanResultsListener,
- callbackIdentifier);
+ mScanRequestProxy.registerScanResultsCallback(mScanResultsCallback);
verify(mBinder).linkToDeath(drCaptor.capture(), anyInt());
testStartScanSuccess();
// Verify the scan results processing.
mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
mLooper.dispatchAll();
- verify(mScanResultsListener).onScanResultsAvailable();
validateScanResultsAvailableBroadcastSent(true);
- reset(mScanResultsListener);
+ verify(mScanResultsCallback).onScanResultsAvailable();
drCaptor.getValue().binderDied();
mLooper.dispatchAll();
- verify(mBinder).unlinkToDeath(drCaptor.capture(), eq(0));
+ reset(mScanResultsCallback);
// Verify the scan results processing.
mGlobalScanListenerArgumentCaptor.getValue().onResults(mTestScanDatas1);
mLooper.dispatchAll();
- verify(mScanResultsListener, never()).onScanResultsAvailable();
validateScanResultsAvailableBroadcastSent(true);
+ verify(mScanResultsCallback, never()).onScanResultsAvailable();
+
}
}
diff --git a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
index a916a2bd6..e527ed05e 100644
--- a/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/WifiServiceImplTest.java
@@ -95,7 +95,7 @@ import android.net.wifi.IDppCallback;
import android.net.wifi.ILocalOnlyHotspotCallback;
import android.net.wifi.INetworkRequestMatchCallback;
import android.net.wifi.IOnWifiUsabilityStatsListener;
-import android.net.wifi.IScanResultsListener;
+import android.net.wifi.IScanResultsCallback;
import android.net.wifi.ISoftApCallback;
import android.net.wifi.ISuggestionConnectionStatusListener;
import android.net.wifi.ITrafficStateCallback;
@@ -279,7 +279,7 @@ public class WifiServiceImplTest extends WifiBaseTest {
@Mock IDppCallback mDppCallback;
@Mock SarManager mSarManager;
@Mock ILocalOnlyHotspotCallback mLohsCallback;
- @Mock IScanResultsListener mClientScanResultsListener;
+ @Mock IScanResultsCallback mScanResultsCallback;
@Mock ISuggestionConnectionStatusListener mSuggestionConnectionStatusListener;
WifiLog mLog = new LogcatLog(TAG);
@@ -4347,53 +4347,44 @@ public class WifiServiceImplTest extends WifiBaseTest {
}
/**
- * Test register scan result listener without permission.
+ * Test register scan result callback without permission.
*/
@Test(expected = SecurityException.class)
- public void testRegisterScanResultListenerWithMissingPermission() throws Exception {
+ public void testRegisterScanResultCallbackWithMissingPermission() throws Exception {
doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
eq(android.Manifest.permission.ACCESS_WIFI_STATE), eq("WifiService"));
- final int listenerIdentifier = 1;
- mWifiServiceImpl.registerScanResultsListener(mAppBinder,
- mClientScanResultsListener,
- listenerIdentifier);
+ mWifiServiceImpl.registerScanResultsCallback(mScanResultsCallback);
}
/**
- * Test unregister scan result listener without permission.
+ * Test unregister scan result callback without permission.
*/
@Test(expected = SecurityException.class)
- public void testUnregisterScanResultListenerWithMissingPermission() throws Exception {
+ public void testUnregisterScanResultCallbackWithMissingPermission() throws Exception {
doThrow(new SecurityException()).when(mContext).enforceCallingOrSelfPermission(
eq(android.Manifest.permission.ACCESS_WIFI_STATE), eq("WifiService"));
- final int listenerIdentifier = 1;
- mWifiServiceImpl.unregisterScanResultsListener(listenerIdentifier);
+ mWifiServiceImpl.unregisterScanResultsCallback(mScanResultsCallback);
}
/**
- * Test register scan result listener with illegal argument.
+ * Test register scan result callback with illegal argument.
*/
@Test(expected = IllegalArgumentException.class)
- public void testRegisterScanResultListenerWithIllegalArgument() throws Exception {
- final int listenerIdentifier = 1;
- mWifiServiceImpl.registerScanResultsListener(mAppBinder, null, listenerIdentifier);
+ public void testRegisterScanResultCallbackWithIllegalArgument() throws Exception {
+ mWifiServiceImpl.registerScanResultsCallback(null);
}
/**
- * Test register and unregister listener will go to ScanRequestProxy;
+ * Test register and unregister callback will go to ScanRequestProxy;
*/
@Test
- public void testRegisterUnregisterScanResultListener() throws Exception {
- final int listenerIdentifier = 1;
- mWifiServiceImpl.registerScanResultsListener(mAppBinder,
- mClientScanResultsListener,
- listenerIdentifier);
+ public void testRegisterUnregisterScanResultCallback() throws Exception {
+ mWifiServiceImpl.registerScanResultsCallback(mScanResultsCallback);
mLooper.dispatchAll();
- verify(mScanRequestProxy).registerScanResultsListener(eq(mAppBinder),
- eq(mClientScanResultsListener), eq(listenerIdentifier));
- mWifiServiceImpl.unregisterScanResultsListener(listenerIdentifier);
+ verify(mScanRequestProxy).registerScanResultsCallback(mScanResultsCallback);
+ mWifiServiceImpl.unregisterScanResultsCallback(mScanResultsCallback);
mLooper.dispatchAll();
- verify(mScanRequestProxy).unregisterScanResultsListener(eq(listenerIdentifier));
+ verify(mScanRequestProxy).unregisterScanResultsCallback(mScanResultsCallback);
}
/**