[NAN] Refactor WifiNanManager to create separate sessions per connect.

Separate session enables separate namespace for functions which depend
on a connection to exist.

(cherry-pick of commit 471025fa5ecbb3eaedd22e249f16e91fecaf3494)

Bug: 31470256
Test: unit tests
Change-Id: I9d043f53adbba4044db4ffb1f7045ae78d75fb8b
diff --git a/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java b/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java
index e7738db..e21e41c 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanServiceImpl.java
@@ -130,7 +130,7 @@
     }
 
     @Override
-    public int connect(final IBinder binder, String callingPackage, IWifiNanEventCallback callback,
+    public void connect(final IBinder binder, String callingPackage, IWifiNanEventCallback callback,
             ConfigRequest configRequest) {
         enforceAccessPermission();
         enforceChangePermission();
@@ -187,7 +187,7 @@
             } catch (RemoteException e1) {
                 Log.e(TAG, "Error on onConnectFail()");
             }
-            return 0;
+            return;
         }
 
         synchronized (mLock) {
@@ -196,8 +196,6 @@
         }
 
         mStateManager.connect(clientId, uid, pid, callingPackage, callback, configRequest);
-
-        return clientId;
     }
 
     @Override
diff --git a/service/java/com/android/server/wifi/nan/WifiNanStateManager.java b/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
index 0b09c13..950adab 100644
--- a/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
+++ b/service/java/com/android/server/wifi/nan/WifiNanStateManager.java
@@ -1772,7 +1772,7 @@
         ConfigRequest merged = mergeConfigRequests(configRequest);
         if (mCurrentNanConfiguration != null && mCurrentNanConfiguration.equals(merged)) {
             try {
-                callback.onConnectSuccess();
+                callback.onConnectSuccess(clientId);
             } catch (RemoteException e) {
                 Log.w(TAG, "connectLocal onConnectSuccess(): RemoteException (FYI): " + e);
             }
@@ -2069,7 +2069,7 @@
                     callingPackage, callback, configRequest);
             mClients.put(clientId, client);
             try {
-                callback.onConnectSuccess();
+                callback.onConnectSuccess(clientId);
             } catch (RemoteException e) {
                 Log.w(TAG,
                         "onConfigCompletedLocal onConnectSuccess(): RemoteException (FYI): " + e);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanDataPathStateManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanDataPathStateManagerTest.java
index 20b9103..31c5024 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanDataPathStateManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanDataPathStateManagerTest.java
@@ -50,6 +50,7 @@
 import android.net.wifi.nan.WifiNanEventCallback;
 import android.net.wifi.nan.WifiNanManager;
 import android.net.wifi.nan.WifiNanPublishDiscoverySession;
+import android.net.wifi.nan.WifiNanSession;
 import android.net.wifi.nan.WifiNanSubscribeDiscoverySession;
 import android.os.Handler;
 import android.os.IBinder;
@@ -597,6 +598,8 @@
         final ConfigRequest configRequest = new ConfigRequest.Builder().build();
         final PublishConfig publishConfig = new PublishConfig.Builder().build();
 
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
         ArgumentCaptor<IWifiNanDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
@@ -608,15 +611,13 @@
         WifiNanDiscoverySessionCallback mockSessionCallback = mock(
                 WifiNanDiscoverySessionCallback.class);
 
-        when(mMockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), any(ConfigRequest.class))).thenReturn(clientId);
-
         mgr.connect(mMockLooperHandler, configRequest, mockCallback);
         verify(mMockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        mgr.publish(publishConfig, mockSessionCallback);
+        verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        sessionCaptor.getValue().publish(publishConfig, mockSessionCallback);
         verify(mMockNanService).publish(eq(clientId), eq(publishConfig),
                 sessionProxyCallback.capture());
         sessionProxyCallback.getValue().onSessionStarted(sessionId);
@@ -644,21 +645,21 @@
         final ConfigRequest configRequest = new ConfigRequest.Builder().build();
         final WifiNanManager mgr = new WifiNanManager(mMockContext, mMockNanService);
 
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
 
         WifiNanEventCallback mockCallback = mock(WifiNanEventCallback.class);
 
-        when(mMockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), any(ConfigRequest.class))).thenReturn(clientId);
-
         mgr.connect(mMockLooperHandler, configRequest, mockCallback);
         verify(mMockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
+        verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
 
-        String ns = mgr.createNetworkSpecifier(role, peer,
+        String ns = sessionCaptor.getValue().createNetworkSpecifier(role, peer,
                 (token == null) ? null : token.getBytes());
         NetworkCapabilities nc = new NetworkCapabilities();
         nc.clearAll();
@@ -720,7 +721,7 @@
                 eq(configRequest), eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mMockCallback).onConnectSuccess();
+        inOrder.verify(mMockCallback).onConnectSuccess(clientId);
         mDut.publish(clientId, publishConfig, mMockSessionCallback);
         mMockLooper.dispatchAll();
         inOrder.verify(mMockNative).publish(transactionId.capture(), eq(0), eq(publishConfig));
diff --git a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanManagerTest.java
index fd29ba6..137975b 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanManagerTest.java
@@ -40,6 +40,7 @@
 import android.net.wifi.nan.WifiNanEventCallback;
 import android.net.wifi.nan.WifiNanManager;
 import android.net.wifi.nan.WifiNanPublishDiscoverySession;
+import android.net.wifi.nan.WifiNanSession;
 import android.net.wifi.nan.WifiNanSubscribeDiscoverySession;
 import android.os.Handler;
 import android.os.IBinder;
@@ -141,46 +142,43 @@
      */
 
     /**
-     * Validate the successful connect flow: (1) try subscribing (2) connect +
-     * success (3) publish, (4) disconnect (5) try publishing (6) connect again
+     * Validate the successful connect flow: (1) connect + success (2) publish, (3) disconnect
+     * (4) try publishing on old session (5) connect again
      */
     @Test
     public void testConnectFlow() throws Exception {
         final int clientId = 4565;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), any(ConfigRequest.class))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IBinder> binder = ArgumentCaptor.forClass(IBinder.class);
 
-        // (1) try subscribing on an unconnected manager: fails silently
-        mDut.subscribe(new SubscribeConfig.Builder().build(), mockSessionCallback);
-
-        // (2) connect + success
+        // (1) connect + success
         mDut.connect(mMockLooperHandler, mockCallback);
         inOrder.verify(mockNanService).connect(binder.capture(), anyString(),
                 clientProxyCallback.capture(), (ConfigRequest) isNull());
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
-        // (3) publish - should succeed
+        // (2) publish - should succeed
         PublishConfig publishConfig = new PublishConfig.Builder().build();
-        mDut.publish(publishConfig, mockSessionCallback);
+        session.publish(publishConfig, mockSessionCallback);
         inOrder.verify(mockNanService).publish(eq(clientId), eq(publishConfig),
                 any(IWifiNanDiscoverySessionCallback.class));
 
-        // (4) disconnect
-        mDut.disconnect();
+        // (3) disconnect
+        session.disconnect();
         inOrder.verify(mockNanService).disconnect(eq(clientId), eq(binder.getValue()));
 
-        // (5) try publishing again - fails silently
-        mDut.publish(new PublishConfig.Builder().build(), mockSessionCallback);
+        // (4) try publishing again - fails silently
+        session.publish(new PublishConfig.Builder().build(), mockSessionCallback);
 
-        // (6) connect
+        // (5) connect
         mDut.connect(mMockLooperHandler, mockCallback);
         inOrder.verify(mockNanService).connect(binder.capture(), anyString(),
                 any(IWifiNanEventCallback.class), (ConfigRequest) isNull());
@@ -189,18 +187,16 @@
     }
 
     /**
-     * Validate the failed connect flow: (1) connect + failure, (2) try
-     * publishing (3) connect + success (4) subscribe
+     * Validate the failed connect flow: (1) connect + failure, (2) connect + success (3) subscribe
      */
     @Test
     public void testConnectFailure() throws Exception {
         final int clientId = 4565;
         final int reason = WifiNanEventCallback.REASON_OTHER;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), any(ConfigRequest.class))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService);
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
 
@@ -212,21 +208,18 @@
         mMockLooper.dispatchAll();
         inOrder.verify(mockCallback).onConnectFail(reason);
 
-        // (2) try publishing - silent failure (since already know that no
-        // connection)
-        mDut.publish(new PublishConfig.Builder().build(), mockSessionCallback);
-
-        // (3) connect + success
+        // (2) connect + success
         mDut.connect(mMockLooperHandler, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), (ConfigRequest) isNull());
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         // (4) subscribe: should succeed
         SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
-        mDut.subscribe(subscribeConfig, mockSessionCallback);
+        session.subscribe(subscribeConfig, mockSessionCallback);
         inOrder.verify(mockNanService).subscribe(eq(clientId), eq(subscribeConfig),
                 any(IWifiNanDiscoverySessionCallback.class));
 
@@ -234,16 +227,13 @@
     }
 
     /**
-     * Validate that cannot call connect on an existing connection: (1) connect
+     * Validate that can call connect to create multiple sessions: (1) connect
      * + success, (2) try connect again
      */
     @Test
     public void testInvalidConnectSequence() throws Exception {
         final int clientId = 4565;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), any(ConfigRequest.class))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
@@ -252,14 +242,17 @@
         mDut.connect(mMockLooperHandler, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), (ConfigRequest) isNull());
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(any(WifiNanSession.class));
 
-        // (2) connect - forward to service (though will fail silently)
+        // (2) connect + success
         mDut.connect(mMockLooperHandler, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), (ConfigRequest) isNull());
+        clientProxyCallback.getValue().onConnectSuccess(clientId + 1);
+        mMockLooper.dispatchAll();
+        inOrder.verify(mockCallback).onConnectSuccess(any(WifiNanSession.class));
 
         verifyNoMoreInteractions(mockCallback, mockSessionCallback, mockNanService);
     }
@@ -286,11 +279,10 @@
         final int messageId = 2123;
         final int reason = WifiNanDiscoverySessionCallback.REASON_OTHER;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), eq(configRequest))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService,
                 mockPublishSession);
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
         ArgumentCaptor<IWifiNanDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
@@ -302,12 +294,13 @@
         mDut.connect(mMockLooperHandler, configRequest, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         // (1) publish
-        mDut.publish(publishConfig, mockSessionCallback);
+        session.publish(publishConfig, mockSessionCallback);
         inOrder.verify(mockNanService).publish(eq(clientId), eq(publishConfig),
                 sessionProxyCallback.capture());
 
@@ -365,11 +358,10 @@
         final PublishConfig publishConfig = new PublishConfig.Builder().build();
         final int reason = WifiNanDiscoverySessionCallback.TERMINATE_REASON_DONE;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), eq(configRequest))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService,
                 mockPublishSession);
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
         ArgumentCaptor<IWifiNanDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
@@ -381,12 +373,13 @@
         mDut.connect(mMockLooperHandler, configRequest, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         // (2) publish: successfully - then terminated
-        mDut.publish(publishConfig, mockSessionCallback);
+        session.publish(publishConfig, mockSessionCallback);
         inOrder.verify(mockNanService).publish(eq(clientId), eq(publishConfig),
                 sessionProxyCallback.capture());
         sessionProxyCallback.getValue().onSessionStarted(sessionId);
@@ -420,11 +413,10 @@
         final int messageId = 2123;
         final int reason = WifiNanDiscoverySessionCallback.REASON_OTHER;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), eq(configRequest))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService,
                 mockSubscribeSession);
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
         ArgumentCaptor<IWifiNanDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
@@ -436,12 +428,13 @@
         mDut.connect(mMockLooperHandler, configRequest, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         // (1) subscribe
-        mDut.subscribe(subscribeConfig, mockSessionCallback);
+        session.subscribe(subscribeConfig, mockSessionCallback);
         inOrder.verify(mockNanService).subscribe(eq(clientId), eq(subscribeConfig),
                 sessionProxyCallback.capture());
 
@@ -499,11 +492,10 @@
         final SubscribeConfig subscribeConfig = new SubscribeConfig.Builder().build();
         final int reason = WifiNanDiscoverySessionCallback.TERMINATE_REASON_DONE;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), eq(configRequest))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService,
                 mockSubscribeSession);
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
         ArgumentCaptor<IWifiNanDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
@@ -515,12 +507,13 @@
         mDut.connect(mMockLooperHandler, configRequest, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         // (2) subscribe: successfully - then terminated
-        mDut.subscribe(subscribeConfig, mockSessionCallback);
+        session.subscribe(subscribeConfig, mockSessionCallback);
         inOrder.verify(mockNanService).subscribe(eq(clientId), eq(subscribeConfig),
                 sessionProxyCallback.capture());
         sessionProxyCallback.getValue().onSessionStarted(sessionId);
@@ -868,13 +861,13 @@
         final RttManager.RttResult rttResults = new RttManager.RttResult();
         rttResults.distance = 10;
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), eq(configRequest))).thenReturn(clientId);
         when(mockNanService.startRanging(anyInt(), anyInt(),
                 any(RttManager.ParcelableRttParams.class))).thenReturn(rangingId);
 
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService,
                 mockPublishSession, mockRttListener);
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
         ArgumentCaptor<IWifiNanDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
@@ -890,12 +883,13 @@
         mDut.connect(mMockLooperHandler, configRequest, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         // (2) publish successfully
-        mDut.publish(publishConfig, mockSessionCallback);
+        session.publish(publishConfig, mockSessionCallback);
         inOrder.verify(mockNanService).publish(eq(clientId), eq(publishConfig),
                 sessionProxyCallback.capture());
         sessionProxyCallback.getValue().onSessionStarted(sessionId);
@@ -947,6 +941,8 @@
 
         String tokenB64 = Base64.encodeToString(token.getBytes(), Base64.DEFAULT);
 
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
         ArgumentCaptor<IWifiNanDiscoverySessionCallback> sessionProxyCallback = ArgumentCaptor
@@ -954,9 +950,6 @@
         ArgumentCaptor<WifiNanPublishDiscoverySession> publishSession = ArgumentCaptor
                 .forClass(WifiNanPublishDiscoverySession.class);
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), any(ConfigRequest.class))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService,
                 mockPublishSession, mockRttListener);
 
@@ -964,12 +957,13 @@
         mDut.connect(mMockLooperHandler, configRequest, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         // (2) publish successfully
-        mDut.publish(publishConfig, mockSessionCallback);
+        session.publish(publishConfig, mockSessionCallback);
         inOrder.verify(mockNanService).publish(eq(clientId), eq(publishConfig),
                 sessionProxyCallback.capture());
         sessionProxyCallback.getValue().onSessionStarted(sessionId);
@@ -1011,12 +1005,11 @@
 
         String tokenB64 = Base64.encodeToString(token.getBytes(), Base64.DEFAULT);
 
+        ArgumentCaptor<WifiNanSession> sessionCaptor = ArgumentCaptor.forClass(
+                WifiNanSession.class);
         ArgumentCaptor<IWifiNanEventCallback> clientProxyCallback = ArgumentCaptor
                 .forClass(IWifiNanEventCallback.class);
 
-        when(mockNanService.connect(any(IBinder.class), anyString(),
-                any(IWifiNanEventCallback.class), any(ConfigRequest.class))).thenReturn(clientId);
-
         InOrder inOrder = inOrder(mockCallback, mockSessionCallback, mockNanService,
                 mockPublishSession, mockRttListener);
 
@@ -1024,12 +1017,13 @@
         mDut.connect(mMockLooperHandler, configRequest, mockCallback);
         inOrder.verify(mockNanService).connect(any(IBinder.class), anyString(),
                 clientProxyCallback.capture(), eq(configRequest));
-        clientProxyCallback.getValue().onConnectSuccess();
+        clientProxyCallback.getValue().onConnectSuccess(clientId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(sessionCaptor.capture());
+        WifiNanSession session = sessionCaptor.getValue();
 
         /* (2) request a direct network specifier*/
-        String networkSpecifier = mDut.createNetworkSpecifier(role, someMac, token.getBytes());
+        String networkSpecifier = session.createNetworkSpecifier(role, someMac, token.getBytes());
 
         /* validate format*/
         JSONObject jsonObject = new JSONObject(networkSpecifier);
diff --git a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanServiceImplTest.java
index 891d1fc..f7077af 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanServiceImplTest.java
@@ -21,7 +21,9 @@
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.anyInt;
+import static org.mockito.Matchers.anyString;
 import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -43,6 +45,7 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
+import org.mockito.InOrder;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
@@ -167,13 +170,11 @@
         ConfigRequest configRequest = new ConfigRequest.Builder().setMasterPreference(55).build();
         String callingPackage = "com.google.somePackage";
 
-        int returnedClientId = mDut.connect(mBinderMock, callingPackage, mCallbackMock,
+        mDut.connect(mBinderMock, callingPackage, mCallbackMock,
                 configRequest);
 
-        ArgumentCaptor<Integer> clientId = ArgumentCaptor.forClass(Integer.class);
-        verify(mNanStateManagerMock).connect(clientId.capture(), anyInt(), anyInt(),
+        verify(mNanStateManagerMock).connect(anyInt(), anyInt(), anyInt(),
                 eq(callingPackage), eq(mCallbackMock), eq(configRequest));
-        assertEquals(returnedClientId, (int) clientId.getValue());
     }
 
     /**
@@ -272,9 +273,15 @@
     public void testClientIdIncrementing() {
         int loopCount = 100;
 
+        InOrder inOrder = inOrder(mNanStateManagerMock);
+        ArgumentCaptor<Integer> clientIdCaptor = ArgumentCaptor.forClass(Integer.class);
+
         int prevId = 0;
         for (int i = 0; i < loopCount; ++i) {
-            int id = mDut.connect(mBinderMock, "", mCallbackMock, null);
+            mDut.connect(mBinderMock, "", mCallbackMock, null);
+            inOrder.verify(mNanStateManagerMock).connect(clientIdCaptor.capture(), anyInt(),
+                    anyInt(), anyString(), eq(mCallbackMock), any(ConfigRequest.class));
+            int id = clientIdCaptor.getValue();
             if (i != 0) {
                 assertTrue("Client ID incrementing", id > prevId);
             }
@@ -488,14 +495,13 @@
     private int doConnect() {
         String callingPackage = "com.google.somePackage";
 
-        int returnedClientId = mDut.connect(mBinderMock, callingPackage, mCallbackMock, null);
+        mDut.connect(mBinderMock, callingPackage, mCallbackMock, null);
 
         ArgumentCaptor<Integer> clientId = ArgumentCaptor.forClass(Integer.class);
         verify(mNanStateManagerMock).connect(clientId.capture(), anyInt(), anyInt(),
                 eq(callingPackage), eq(mCallbackMock), eq(new ConfigRequest.Builder().build()));
-        assertEquals(returnedClientId, (int) clientId.getValue());
 
-        return returnedClientId;
+        return clientId.getValue();
     }
 
     private void installMockNanStateManager()
diff --git a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java
index 435a6ac..cb78f72 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/nan/WifiNanStateManagerTest.java
@@ -33,10 +33,10 @@
 import static org.mockito.Mockito.verifyNoMoreInteractions;
 import static org.mockito.Mockito.when;
 
-import android.app.test.MockAnswerUtil;
-import android.app.test.TestAlarmManager;
 import android.Manifest;
 import android.app.AppOpsManager;
+import android.app.test.MockAnswerUtil;
+import android.app.test.TestAlarmManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -248,7 +248,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (3) disable usage & verify callbacks
         mDut.disableUsage();
@@ -282,7 +282,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         verifyNoMoreInteractions(mMockNative, mockCallback);
     }
@@ -334,7 +334,7 @@
         short transactionId = transactionIdCapture.getValue();
         mDut.onConfigSuccessResponse(transactionId);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback1).onConnectSuccess();
+        inOrder.verify(mockCallback1).onConnectSuccess(clientId1);
 
         // (2) finish connection of 2nd client
         inOrder.verify(mMockNative).enableAndConfigure(transactionIdCapture.capture(),
@@ -343,7 +343,7 @@
         mDut.onConfigSuccessResponse(transactionId);
         mMockLooper.dispatchAll();
 
-        inOrder.verify(mockCallback2).onConnectSuccess();
+        inOrder.verify(mockCallback2).onConnectSuccess(clientId2);
 
         // (3) deliver NAN events - without LOCATIONING permission
         mDut.onClusterChangeNotification(WifiNanClientState.CLUSTER_CHANGE_EVENT_STARTED, someMac);
@@ -418,7 +418,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) publish + timeout
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -476,7 +476,7 @@
                 eq(configRequest), eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial publish
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -531,7 +531,7 @@
                 eq(configRequest), eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial publish
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -605,7 +605,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial publish
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -679,7 +679,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial publish
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -738,7 +738,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial subscribe
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -793,7 +793,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial subscribe
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -866,7 +866,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial subscribe
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -940,7 +940,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) initial subscribe
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1014,7 +1014,7 @@
                 eq(configRequest), eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) subscribe
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1121,7 +1121,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) publish
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -1216,7 +1216,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) publish
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -1300,7 +1300,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) subscribe & match
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1367,7 +1367,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) subscribe & match
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1461,7 +1461,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) subscribe & match
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1548,7 +1548,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) subscribe & match
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1639,7 +1639,7 @@
                 eq(configRequest), eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (1) subscribe
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1755,7 +1755,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        verify(mockCallback).onConnectSuccess();
+        verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) subscribe & match
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -1923,7 +1923,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) subscribe & match
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -2008,7 +2008,7 @@
         collector.checkThat("merge: stage 1", crCapture.getValue(), equalTo(configRequest1));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback1).onConnectSuccess();
+        inOrder.verify(mockCallback1).onConnectSuccess(clientId1);
 
         // (2) config2 (incompatible with config1)
         mDut.connect(clientId2, uid, pid, callingPackage, mockCallback2, configRequest2);
@@ -2035,7 +2035,7 @@
                 crCapture.getValue().mEnableIdentityChangeCallback, equalTo(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback3).onConnectSuccess();
+        inOrder.verify(mockCallback3).onConnectSuccess(clientId3);
 
         // (4) disconnect config3: want a downgrade
         mDut.disconnect(clientId3);
@@ -2101,7 +2101,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) publish (no response yet)
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -2177,7 +2177,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) publish - no response
         mDut.publish(clientId, publishConfig, mockPublishSessionCallback);
@@ -2257,7 +2257,7 @@
         short transactionIdConfig = transactionId.getValue();
         mDut.onConfigSuccessResponse(transactionIdConfig);
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) use the same transaction ID to send a bunch of other responses
         mDut.onConfigSuccessResponse(transactionIdConfig);
@@ -2313,7 +2313,7 @@
                 eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) publish
         mDut.publish(clientId, publishConfig, mockSessionCallback);
@@ -2369,7 +2369,7 @@
                 eq(configRequest), eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         // (2) subscribe
         mDut.subscribe(clientId, subscribeConfig, mockSessionCallback);
@@ -2423,7 +2423,7 @@
                 eq(configRequest), eq(true));
         mDut.onConfigSuccessResponse(transactionId.getValue());
         mMockLooper.dispatchAll();
-        inOrder.verify(mockCallback).onConnectSuccess();
+        inOrder.verify(mockCallback).onConnectSuccess(clientId);
 
         int prevId = 0;
         for (int i = 0; i < loopCount; ++i) {