OSDN Git Service

Change SUPL network request parameters for requestRouteToHostAddress
authorAnil Admal <aadmal@google.com>
Sun, 7 Apr 2019 00:37:22 +0000 (17:37 -0700)
committerAnil Admal <aadmal@google.com>
Mon, 8 Apr 2019 22:19:20 +0000 (15:19 -0700)
CL aosp/940825 extends support for requestRouteToHostAddress in the
ConnectivityService for SUPL network setup requests originating from
pre-gnss@2.0 HALs. For this to work, a corresponding change is also
needed in the way the SUPL network requests are constructed in the
GnssNetworkConnectivityHandler class.

Bug: 121222025
Test: Verified on a Pixel device with gnss@1.1 HAL.
Change-Id: I420393c74926d9fd83e939f5380fe69abaa486f6

services/core/java/com/android/server/location/GnssNetworkConnectivityHandler.java

index ab75b21..2948aaf 100644 (file)
@@ -199,29 +199,27 @@ class GnssNetworkConnectivityHandler {
     }
 
     /**
-     * called from native code to update AGPS status
+     * Called from native code to update AGPS connection status, or to request or release a SUPL
+     * connection.
+     *
+     * <p>Note: {@code suplIpAddr} parameter is not present from IAGnssCallback.hal@2.0 onwards
+     * and is set to {@code null}.
      */
     void onReportAGpsStatus(int agpsType, int agpsStatus, byte[] suplIpAddr) {
+        if (DEBUG) Log.d(TAG, "AGPS_DATA_CONNECTION: " + agpsDataConnStatusAsString(agpsStatus));
         switch (agpsStatus) {
             case GPS_REQUEST_AGPS_DATA_CONN:
-                if (DEBUG) Log.d(TAG, "GPS_REQUEST_AGPS_DATA_CONN");
                 runOnHandler(() -> handleRequestSuplConnection(agpsType, suplIpAddr));
                 break;
             case GPS_RELEASE_AGPS_DATA_CONN:
-                if (DEBUG) Log.d(TAG, "GPS_RELEASE_AGPS_DATA_CONN");
                 runOnHandler(() -> handleReleaseSuplConnection(GPS_RELEASE_AGPS_DATA_CONN));
                 break;
             case GPS_AGPS_DATA_CONNECTED:
-                if (DEBUG) Log.d(TAG, "GPS_AGPS_DATA_CONNECTED");
-                break;
             case GPS_AGPS_DATA_CONN_DONE:
-                if (DEBUG) Log.d(TAG, "GPS_AGPS_DATA_CONN_DONE");
-                break;
             case GPS_AGPS_DATA_CONN_FAILED:
-                if (DEBUG) Log.d(TAG, "GPS_AGPS_DATA_CONN_FAILED");
                 break;
             default:
-                if (DEBUG) Log.d(TAG, "Received Unknown AGPS status: " + agpsStatus);
+                Log.w(TAG, "Received unknown AGPS status: " + agpsStatus);
         }
     }
 
@@ -459,11 +457,17 @@ class GnssNetworkConnectivityHandler {
         }
         mAGpsDataConnectionState = AGPS_DATA_CONNECTION_OPENING;
 
-        NetworkRequest.Builder requestBuilder = new NetworkRequest.Builder();
-        requestBuilder.addCapability(getNetworkCapability(mAGpsType));
-        NetworkRequest request = requestBuilder.build();
+        // The NetworkRequest.Builder class is not used to construct the network request because
+        // the ConnectivityService requires the network request to be constructed in this way
+        // to extend support for requestRouteToHostAddress() method for pre-gnss@2.0 devices.
+        NetworkCapabilities networkCapabilities = new NetworkCapabilities();
+        networkCapabilities.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR);
+        networkCapabilities.addCapability(getNetworkCapability(mAGpsType));
+        NetworkRequest networkRequest = new NetworkRequest(networkCapabilities,
+                getLegacyDataConnectionType(agpsType), ConnectivityManager.REQUEST_ID_UNSET,
+                NetworkRequest.Type.REQUEST);
         mConnMgr.requestNetwork(
-                request,
+                networkRequest,
                 mSuplConnectivityCallback,
                 mHandler,
                 SUPL_NETWORK_REQUEST_TIMEOUT_MILLIS);
@@ -483,6 +487,19 @@ class GnssNetworkConnectivityHandler {
         }
     }
 
+    private int getLegacyDataConnectionType(int agpsType) {
+        switch (agpsType) {
+            case AGPS_TYPE_C2K:
+            case AGPS_TYPE_SUPL:
+                return ConnectivityManager.TYPE_MOBILE_SUPL;
+            case AGPS_TYPE_EIMS:
+                return ConnectivityManager.TYPE_MOBILE_EMERGENCY;
+            case AGPS_TYPE_IMS:
+                return ConnectivityManager.TYPE_MOBILE_IMS;
+            default:
+                throw new IllegalArgumentException("agpsType: " + agpsType);
+        }
+    }
     private void handleReleaseSuplConnection(int agpsDataConnStatus) {
         if (DEBUG) {
             String message = String.format(
@@ -546,7 +563,7 @@ class GnssNetworkConnectivityHandler {
             case AGPS_DATA_CONNECTION_OPENING:
                 return "OPENING";
             default:
-                return "<Unknown>";
+                return "<Unknown>(" + mAGpsDataConnectionState + ")";
         }
     }
 
@@ -566,7 +583,7 @@ class GnssNetworkConnectivityHandler {
             case GPS_REQUEST_AGPS_DATA_CONN:
                 return "REQUEST";
             default:
-                return "<Unknown>";
+                return "<Unknown>(" + agpsDataConnStatus + ")";
         }
     }
 
@@ -581,7 +598,7 @@ class GnssNetworkConnectivityHandler {
             case AGPS_TYPE_IMS:
                 return "IMS";
             default:
-                return "<Unknown>";
+                return "<Unknown>(" + agpsType + ")";
         }
     }
 
@@ -658,4 +675,4 @@ class GnssNetworkConnectivityHandler {
 
     private native void native_update_network_state(boolean connected, int type, boolean roaming,
             boolean available, String apn, long networkHandle, short capabilities);
-}
\ No newline at end of file
+}