Fix AttributionSource usage in WifiRtt

Avoid creating AttributionSource outside of Binder thread.

Bug: 267231571
Bug: 244465118
Test: atest com.android.server.wifi
(cherry picked from commit 0317c109ab6bb2ebcf4a3391279b51a77677bd8e)
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:af9c66acbaac56b7813d79e2346b2a95197273d7)
Merged-In: Ie8c41292f28f40e44d486db4e1eec688425196c8
Change-Id: Ie8c41292f28f40e44d486db4e1eec688425196c8
diff --git a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
index 7cd1ea9..5842889 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.annotation.NonNull;
 import android.app.ActivityManager;
+import android.content.AttributionSource;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -434,17 +435,21 @@
         // check if only Aware APs are ranged.
         boolean onlyAwareApRanged = request.mRttPeers.stream().allMatch(
                 config -> config.responderType == ResponderConfig.RESPONDER_AWARE);
+        final Object attributionSource;
         if (onlyAwareApRanged && SdkLevel.isAtLeastT()) {
             // Special case: if only aware APs are ranged, then allow this request if the caller
             // has nearby permission.
-            if (!mWifiPermissionsUtil.checkNearbyDevicesPermission(extras.getParcelable(
-                            WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE), true,
+            attributionSource = extras.getParcelable(
+                    WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE);
+            if (!mWifiPermissionsUtil.checkNearbyDevicesPermission(
+                    (AttributionSource) attributionSource, true,
                     "wifi aware ranging")) {
                 // No nearby permission. Still check for location permission.
                 mWifiPermissionsUtil.enforceFineLocationPermission(
                         callingPackage, callingFeatureId, uid);
             }
         } else {
+            attributionSource = null;
             mWifiPermissionsUtil.enforceFineLocationPermission(
                     callingPackage, callingFeatureId, uid);
         }
@@ -490,7 +495,7 @@
             }
             mRttServiceSynchronized.queueRangingRequest(uid, sourceToUse, binder, dr,
                     callingPackage, callingFeatureId, request, callback,
-                    isCalledFromPrivilegedContext, extras);
+                    isCalledFromPrivilegedContext, attributionSource);
         });
     }
 
@@ -699,7 +704,7 @@
         private void queueRangingRequest(int uid, WorkSource workSource, IBinder binder,
                 IBinder.DeathRecipient dr, String callingPackage, String callingFeatureId,
                 RangingRequest request, IRttCallback callback,
-                boolean isCalledFromPrivilegedContext, Bundle extras) {
+                boolean isCalledFromPrivilegedContext, Object attributionSource) {
             mRttMetrics.recordRequest(workSource, request);
 
             if (isRequestorSpamming(workSource)) {
@@ -726,7 +731,7 @@
             newRequest.request = request;
             newRequest.callback = callback;
             newRequest.isCalledFromPrivilegedContext = isCalledFromPrivilegedContext;
-            newRequest.extras = extras;
+            newRequest.attributionSource = attributionSource;
             mRttRequestQueue.add(newRequest);
 
             if (VDBG) {
@@ -1099,8 +1104,7 @@
                 // Special case: if only aware APs are ranged, then allow this request if the caller
                 // has nearby permission.
                 permissionGranted = mWifiPermissionsUtil.checkNearbyDevicesPermission(
-                        topOfQueueRequest.extras.getParcelable(
-                                WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE), true,
+                        (AttributionSource) topOfQueueRequest.attributionSource, true,
                         "wifi aware on ranging result");
             }
             if (!permissionGranted) {
@@ -1242,7 +1246,9 @@
         public RangingRequest request;
         public IRttCallback callback;
         public boolean isCalledFromPrivilegedContext;
-        public Bundle extras;
+        // This should be of Class AttributionSource, not is declared as Object for mainline
+        // backward compatibility.
+        public Object attributionSource;
 
         public int cmdId = 0; // uninitialized cmdId value
         public boolean dispatchedToNative = false;
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 517f92c..68aeb5b 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
@@ -45,6 +45,7 @@
 import android.app.AlarmManager;
 import android.app.test.MockAnswerUtil;
 import android.app.test.TestAlarmManager;
+import android.content.AttributionSource;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.Intent;
@@ -412,7 +413,8 @@
     @Test
     public void testRangingOnlyAwareAps() throws Exception {
         assumeTrue(SdkLevel.isAtLeastT());
-        mExtras.putParcelable(WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE, null);
+        mExtras.putParcelable(WifiManager.EXTRA_PARAM_KEY_ATTRIBUTION_SOURCE, mock(
+                AttributionSource.class));
         when(mockPermissionUtil.checkNearbyDevicesPermission(any(), eq(true), any()))
                 .thenReturn(true);
         RangingRequest request = new RangingRequest.Builder()