ClientModeManager: Enable verbose logging on creation

If verbose logging was turned on before ClientModeImpl instance is
created, we need to propagate it through.

Also,
1. Do the same for external scorer (if registered before ClientModeImpl
creation, propagate it on creation). This is kind of duplicated in
ActiveModeWarden -> ClientModeManager as well.
2. Clarify in comments & variable name that the scorer will be in use
for secondary ClientModeManager instances as well (since we decided to
use external scorer in MBB).

Bug: 168041558
Test: atest com.android.server.wifi
Change-Id: I0f9f5667541f13be971f4887c088e467bfaca6a9
diff --git a/service/java/com/android/server/wifi/ActiveModeWarden.java b/service/java/com/android/server/wifi/ActiveModeWarden.java
index ca3ca62..e4fffe6 100644
--- a/service/java/com/android/server/wifi/ActiveModeWarden.java
+++ b/service/java/com/android/server/wifi/ActiveModeWarden.java
@@ -98,8 +98,8 @@
     private boolean mCanRequestMoreSoftApManagers = false;
     private boolean mIsShuttingdown = false;
     private boolean mVerboseLoggingEnabled = false;
-    /** Cache to store the external scorer for primary client mode manager. */
-    @Nullable private Pair<IBinder, IWifiConnectedNetworkScorer> mPrimaryClientModeManagerScorer;
+    /** Cache to store the external scorer for primary and secondary (MBB) client mode manager. */
+    @Nullable private Pair<IBinder, IWifiConnectedNetworkScorer> mClientModeManagerScorer;
 
     /**
      * Called from WifiServiceImpl to register a callback for notifications from SoftApManager
@@ -283,7 +283,7 @@
      */
     public boolean setWifiConnectedNetworkScorer(IBinder binder,
             IWifiConnectedNetworkScorer scorer) {
-        mPrimaryClientModeManagerScorer = Pair.create(binder, scorer);
+        mClientModeManagerScorer = Pair.create(binder, scorer);
         return getPrimaryClientModeManager().setWifiConnectedNetworkScorer(binder, scorer);
     }
 
@@ -291,7 +291,7 @@
      * See {@link WifiManager#clearWifiConnectedNetworkScorer()}
      */
     public void clearWifiConnectedNetworkScorer() {
-        mPrimaryClientModeManagerScorer = null;
+        mClientModeManagerScorer = null;
         getPrimaryClientModeManager().clearWifiConnectedNetworkScorer();
     }
 
@@ -664,12 +664,12 @@
             return false;
         }
         manager.enableVerboseLogging(mVerboseLoggingEnabled);
-        if (mPrimaryClientModeManagerScorer != null) {
+        if (mClientModeManagerScorer != null) {
             // TODO (b/160346062): Clear the connected scorer from this mode manager when
             // we switch it out of primary role for the MBB use-case.
             // Also vice versa, we need to set the scorer on the new primary mode manager.
             manager.setWifiConnectedNetworkScorer(
-                    mPrimaryClientModeManagerScorer.first, mPrimaryClientModeManagerScorer.second);
+                    mClientModeManagerScorer.first, mClientModeManagerScorer.second);
         }
         mClientModeManagers.add(manager);
         return true;
diff --git a/service/java/com/android/server/wifi/ConcreteClientModeManager.java b/service/java/com/android/server/wifi/ConcreteClientModeManager.java
index 3e1495f..3bb5e23 100644
--- a/service/java/com/android/server/wifi/ConcreteClientModeManager.java
+++ b/service/java/com/android/server/wifi/ConcreteClientModeManager.java
@@ -61,6 +61,7 @@
 import android.telephony.ims.stub.ImsRegistrationImplBase;
 import android.text.TextUtils;
 import android.util.Log;
+import android.util.Pair;
 
 import com.android.internal.util.IState;
 import com.android.internal.util.State;
@@ -124,6 +125,8 @@
     @Nullable
     private ClientRole mTargetRole = null;
     private boolean mVerboseLoggingEnabled = false;
+    /** Cache to store the external scorer for primary and secondary client mode impl. */
+    @Nullable private Pair<IBinder, IWifiConnectedNetworkScorer> mScorer;
     private int mActiveSubId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
     /**
      * mClientModeImpl is only non-null when in {@link ClientModeStateMachine.ConnectModeState} -
@@ -808,6 +811,11 @@
                     }
                     mClientModeImpl = mWifiInjector.makeClientModeImpl(
                             mClientInterfaceName, ConcreteClientModeManager.this);
+                    mClientModeImpl.enableVerboseLogging(mVerboseLoggingEnabled);
+                    if (mScorer != null) {
+                        mClientModeImpl.setWifiConnectedNetworkScorer(
+                                mScorer.first, mScorer.second);
+                    }
                 }
                 updateConnectModeState(WifiManager.WIFI_STATE_ENABLED,
                         WifiManager.WIFI_STATE_ENABLING);
@@ -931,11 +939,13 @@
     @Override
     public boolean setWifiConnectedNetworkScorer(
             IBinder binder, IWifiConnectedNetworkScorer scorer) {
+        mScorer = Pair.create(binder, scorer);
         return getClientMode().setWifiConnectedNetworkScorer(binder, scorer);
     }
 
     @Override
     public void clearWifiConnectedNetworkScorer() {
+        mScorer = null;
         getClientMode().clearWifiConnectedNetworkScorer();
     }
 
diff --git a/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java b/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java
index c2e99d3..3c1561c 100644
--- a/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/ConcreteClientModeManagerTest.java
@@ -43,7 +43,9 @@
 import android.net.ConnectivityManager;
 import android.net.ConnectivityManager.NetworkCallback;
 import android.net.NetworkRequest;
+import android.net.wifi.IWifiConnectedNetworkScorer;
 import android.os.Handler;
+import android.os.IBinder;
 import android.os.PersistableBundle;
 import android.os.UserHandle;
 import android.os.WorkSource;
@@ -1221,4 +1223,29 @@
         mLooper.dispatchAll();
         verify(mListener).onRoleChanged(); // callback sent.
     }
+
+    @Test
+    public void propagateVerboseLoggingFlagToClientModeImpl() throws Exception {
+        mClientModeManager.enableVerboseLogging(true);
+        startClientInConnectModeAndVerifyEnabled();
+        verify(mClientModeImpl).enableVerboseLogging(true);
+
+        mClientModeManager.enableVerboseLogging(false);
+        verify(mClientModeImpl).enableVerboseLogging(false);
+    }
+
+    @Test
+    public void propagateConnectedWifiScorerToPrimaryClientModeImpl() throws Exception {
+        IBinder iBinder = mock(IBinder.class);
+        IWifiConnectedNetworkScorer iScorer = mock(IWifiConnectedNetworkScorer.class);
+        mClientModeManager.setWifiConnectedNetworkScorer(iBinder, iScorer);
+        startClientInConnectModeAndVerifyEnabled();
+        verify(mClientModeImpl).setWifiConnectedNetworkScorer(iBinder, iScorer);
+
+        mClientModeManager.clearWifiConnectedNetworkScorer();
+        verify(mClientModeImpl).clearWifiConnectedNetworkScorer();
+
+        mClientModeManager.setWifiConnectedNetworkScorer(iBinder, iScorer);
+        verify(mClientModeImpl, times(2)).setWifiConnectedNetworkScorer(iBinder, iScorer);
+    }
 }