[RTT] Convert to dynamic logging configuration

Tie debugging level to Verbose Wi-Fi debuggging flag. Allow additional
verbose debugging based on (original) static flag.

Bug: 69432628
Test: manually enable/disable and view logs
Change-Id: I64be283fac2cd3cd19cb12613d17ac50270cc802
diff --git a/service/java/com/android/server/wifi/rtt/RttNative.java b/service/java/com/android/server/wifi/rtt/RttNative.java
index e085352..b496ec2 100644
--- a/service/java/com/android/server/wifi/rtt/RttNative.java
+++ b/service/java/com/android/server/wifi/rtt/RttNative.java
@@ -46,6 +46,7 @@
 public class RttNative extends IWifiRttControllerEventCallback.Stub {
     private static final String TAG = "RttNative";
     private static final boolean VDBG = false; // STOPSHIP if true
+    /* package */ boolean mDbg = false;
 
     private final RttServiceImpl mRttService;
     private final HalDeviceManager mHalDeviceManager;
@@ -83,7 +84,7 @@
     }
 
     private void updateController() {
-        if (VDBG) Log.v(TAG, "updateController: mIWifiRttController=" + mIWifiRttController);
+        if (mDbg) Log.v(TAG, "updateController: mIWifiRttController=" + mIWifiRttController);
 
         // only care about isStarted (Wi-Fi started) not isReady - since if not
         // ready then Wi-Fi will also be down.
@@ -124,7 +125,11 @@
      * @return Success status: true for success, false for failure.
      */
     public boolean rangeRequest(int cmdId, RangingRequest request) {
-        if (VDBG) Log.v(TAG, "rangeRequest: cmdId=" + cmdId + ", request=" + request);
+        if (mDbg) {
+            Log.v(TAG,
+                    "rangeRequest: cmdId=" + cmdId + ", # of requests=" + request.mRttPeers.size());
+        }
+        if (VDBG) Log.v(TAG, "rangeRequest: request=" + request);
         synchronized (mLock) {
             if (!isReady()) {
                 Log.e(TAG, "rangeRequest: RttController is null");
@@ -161,7 +166,7 @@
      * @return Success status: true for success, false for failure.
      */
     public boolean rangeCancel(int cmdId, ArrayList<byte[]> macAddresses) {
-        if (VDBG) Log.v(TAG, "rangeCancel: cmdId=" + cmdId);
+        if (mDbg) Log.v(TAG, "rangeCancel: cmdId=" + cmdId);
         synchronized (mLock) {
             if (!isReady()) {
                 Log.e(TAG, "rangeCancel: RttController is null");
@@ -192,7 +197,7 @@
      */
     @Override
     public void onResults(int cmdId, ArrayList<RttResult> halResults) {
-        if (VDBG) Log.v(TAG, "onResults: cmdId=" + cmdId + ", # of results=" + halResults.size());
+        if (mDbg) Log.v(TAG, "onResults: cmdId=" + cmdId + ", # of results=" + halResults.size());
         List<RangingResult> results = new ArrayList<>(halResults.size());
 
         mRttService.onRangingResults(cmdId, halResults);
diff --git a/service/java/com/android/server/wifi/rtt/RttService.java b/service/java/com/android/server/wifi/rtt/RttService.java
index afffbee..fabab89 100644
--- a/service/java/com/android/server/wifi/rtt/RttService.java
+++ b/service/java/com/android/server/wifi/rtt/RttService.java
@@ -67,7 +67,7 @@
 
             RttNative rttNative = new RttNative(mImpl, halDeviceManager);
             mImpl.start(handlerThread.getLooper(), wifiInjector.getClock(), awareBinder, rttNative,
-                    wifiPermissionsUtil);
+                    wifiPermissionsUtil, wifiInjector.getFrameworkFacade());
         }
     }
 }
diff --git a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
index 3417f74..a83383c 100644
--- a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
+++ b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
@@ -22,6 +22,7 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.pm.PackageManager;
+import android.database.ContentObserver;
 import android.hardware.wifi.V1_0.RttResult;
 import android.hardware.wifi.V1_0.RttStatus;
 import android.net.MacAddress;
@@ -42,11 +43,13 @@
 import android.os.RemoteException;
 import android.os.UserHandle;
 import android.os.WorkSource;
+import android.provider.Settings;
 import android.util.Log;
 import android.util.SparseIntArray;
 
 import com.android.internal.util.WakeupMessage;
 import com.android.server.wifi.Clock;
+import com.android.server.wifi.FrameworkFacade;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 
 import java.io.FileDescriptor;
@@ -65,6 +68,7 @@
 public class RttServiceImpl extends IWifiRttManager.Stub {
     private static final String TAG = "RttServiceImpl";
     private static final boolean VDBG = false; // STOPSHIP if true
+    private boolean mDbg = false;
 
     private final Context mContext;
     private Clock mClock;
@@ -102,10 +106,11 @@
      * @param awareBinder The Wi-Fi Aware service (binder) if supported on the system.
      * @param rttNative The Native interface to the HAL.
      * @param wifiPermissionsUtil Utility for permission checks.
+     * @param frameworkFacade Facade for framework classes, allows mocking.
      */
     public void start(Looper looper, Clock clock, IWifiAwareManager awareBinder,
-            RttNative rttNative,
-            WifiPermissionsUtil wifiPermissionsUtil) {
+            RttNative rttNative, WifiPermissionsUtil wifiPermissionsUtil,
+            FrameworkFacade frameworkFacade) {
         mClock = clock;
         mAwareBinder = awareBinder;
         mRttNative = rttNative;
@@ -120,7 +125,7 @@
             @Override
             public void onReceive(Context context, Intent intent) {
                 String action = intent.getAction();
-                if (VDBG) Log.v(TAG, "BroadcastReceiver: action=" + action);
+                if (mDbg) Log.v(TAG, "BroadcastReceiver: action=" + action);
 
                 if (PowerManager.ACTION_DEVICE_IDLE_MODE_CHANGED.equals(action)) {
                     if (mPowerManager.isDeviceIdleMode()) {
@@ -132,11 +137,35 @@
             }
         }, intentFilter);
 
+        frameworkFacade.registerContentObserver(mContext,
+                Settings.Global.getUriFor(Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED), true,
+                new ContentObserver(mRttServiceSynchronized.mHandler) {
+                    @Override
+                    public void onChange(boolean selfChange) {
+                        enableVerboseLogging(frameworkFacade.getIntegerSetting(mContext,
+                                Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED, 0));
+                    }
+                });
+        enableVerboseLogging(frameworkFacade.getIntegerSetting(mContext,
+                Settings.Global.WIFI_VERBOSE_LOGGING_ENABLED, 0));
+
         mRttServiceSynchronized.mHandler.post(() -> {
             rttNative.start();
         });
     }
 
+    private void enableVerboseLogging(int verbose) {
+        if (verbose > 0) {
+            mDbg = true;
+        } else {
+            mDbg = false;
+        }
+        if (VDBG) {
+            mDbg = true; // just override
+        }
+        mRttNative.mDbg = mDbg;
+    }
+
     /*
      * ASYNCHRONOUS DOMAIN - can be called from different threads!
      */
@@ -230,7 +259,7 @@
         IBinder.DeathRecipient dr = new IBinder.DeathRecipient() {
             @Override
             public void binderDied() {
-                if (VDBG) Log.v(TAG, "binderDied: uid=" + uid);
+                if (mDbg) Log.v(TAG, "binderDied: uid=" + uid);
                 binder.unlinkToDeath(this, 0);
 
                 mRttServiceSynchronized.mHandler.post(() -> {
@@ -508,7 +537,7 @@
                 }
             }
 
-            if (VDBG) {
+            if (mDbg) {
                 Log.v(TAG, "isRequestorSpamming: ws=" + ws + ", someone is spamming: " + counts);
             }
             return true;
@@ -805,7 +834,7 @@
             for (ResponderConfig peer : request.mRttPeers) {
                 RttResult resultForRequest = resultEntries.get(peer.macAddress);
                 if (resultForRequest == null) {
-                    if (VDBG) {
+                    if (mDbg) {
                         Log.v(TAG, "postProcessResults: missing=" + peer.macAddress);
                     }
                     if (peer.peerHandle == null) {
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
index 7e71069..d42b795 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
@@ -25,11 +25,13 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
 import static org.mockito.ArgumentMatchers.anyInt;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
 import static org.mockito.Mockito.inOrder;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
@@ -67,6 +69,7 @@
 import android.util.Pair;
 
 import com.android.server.wifi.Clock;
+import com.android.server.wifi.FrameworkFacade;
 import com.android.server.wifi.util.WifiPermissionsUtil;
 
 import org.junit.After;
@@ -133,6 +136,9 @@
     @Mock
     public IRttCallback mockCallback;
 
+    @Mock
+    FrameworkFacade mFrameworkFacade;
+
     /**
      * Using instead of spy to avoid native crash failures - possibly due to
      * spy's copying of state.
@@ -163,6 +169,8 @@
         mMockLooper = new TestLooper();
 
         mAlarmManager = new TestAlarmManager();
+        doNothing().when(mFrameworkFacade).registerContentObserver(eq(mockContext), any(),
+                anyBoolean(), any());
         when(mockContext.getSystemService(Context.ALARM_SERVICE))
                 .thenReturn(mAlarmManager.getAlarmManager());
         mInOrder = inOrder(mAlarmManager.getAlarmManager(), mockContext);
@@ -188,7 +196,7 @@
         doAnswer(mBinderUnlinkToDeathCounter).when(mockIbinder).unlinkToDeath(any(), anyInt());
 
         mDut.start(mMockLooper.getLooper(), mockClock, mockAwareManagerBinder, mockNative,
-                mockPermissionUtil);
+                mockPermissionUtil, mFrameworkFacade);
         mMockLooper.dispatchAll();
         ArgumentCaptor<BroadcastReceiver> bcastRxCaptor = ArgumentCaptor.forClass(
                 BroadcastReceiver.class);