「DO NOT MERGE」Revert "Get ApnIpType from ConnectivityManager#getLinkProperties()" am: d461be709f am: 7d4b7f3466

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/11899380

Change-Id: Ia47585f40a9fd13e2bf80f28e7d344fe63ee2c07
This commit is contained in:
Shinru Han
2020-06-19 15:53:33 +00:00
committed by Automerger Merge Worker

View File

@@ -17,9 +17,8 @@
package com.android.server.location.gnss; package com.android.server.location.gnss;
import android.content.Context; import android.content.Context;
import android.database.Cursor;
import android.net.ConnectivityManager; import android.net.ConnectivityManager;
import android.net.LinkAddress;
import android.net.LinkProperties;
import android.net.Network; import android.net.Network;
import android.net.NetworkCapabilities; import android.net.NetworkCapabilities;
import android.net.NetworkInfo; import android.net.NetworkInfo;
@@ -27,26 +26,25 @@ import android.net.NetworkRequest;
import android.os.Handler; import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.PowerManager; import android.os.PowerManager;
import android.telephony.PhoneStateListener; import android.provider.Telephony.Carriers;
import android.telephony.PreciseCallState; import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager; import android.telephony.PreciseCallState;
import android.telephony.PhoneStateListener;
import android.util.Log; import android.util.Log;
import com.android.internal.location.GpsNetInitiatedHandler; import com.android.internal.location.GpsNetInitiatedHandler;
import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException; import java.net.UnknownHostException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Iterator;
/** /**
* Handles network connection requests and network state change updates for AGPS data download. * Handles network connection requests and network state change updates for AGPS data download.
@@ -387,10 +385,10 @@ class GnssNetworkConnectivityHandler {
private ConnectivityManager.NetworkCallback createSuplConnectivityCallback() { private ConnectivityManager.NetworkCallback createSuplConnectivityCallback() {
return new ConnectivityManager.NetworkCallback() { return new ConnectivityManager.NetworkCallback() {
@Override @Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) { public void onAvailable(Network network) {
if (DEBUG) Log.d(TAG, "SUPL network connection available."); if (DEBUG) Log.d(TAG, "SUPL network connection available.");
// Specific to a change to a SUPL enabled network becoming ready // Specific to a change to a SUPL enabled network becoming ready
handleSuplConnectionAvailable(network, linkProperties); handleSuplConnectionAvailable(network);
} }
@Override @Override
@@ -498,7 +496,7 @@ class GnssNetworkConnectivityHandler {
return networkAttributes; return networkAttributes;
} }
private void handleSuplConnectionAvailable(Network network, LinkProperties linkProperties) { private void handleSuplConnectionAvailable(Network network) {
// TODO: The synchronous method ConnectivityManager.getNetworkInfo() should not be called // TODO: The synchronous method ConnectivityManager.getNetworkInfo() should not be called
// inside the asynchronous ConnectivityManager.NetworkCallback methods. // inside the asynchronous ConnectivityManager.NetworkCallback methods.
NetworkInfo info = mConnMgr.getNetworkInfo(network); NetworkInfo info = mConnMgr.getNetworkInfo(network);
@@ -530,7 +528,7 @@ class GnssNetworkConnectivityHandler {
setRouting(); setRouting();
} }
int apnIpType = getLinkIpType(linkProperties); int apnIpType = getApnIpType(apn);
if (DEBUG) { if (DEBUG) {
String message = String.format( String message = String.format(
"native_agps_data_conn_open: mAgpsApn=%s, mApnIpType=%s", "native_agps_data_conn_open: mAgpsApn=%s, mApnIpType=%s",
@@ -706,32 +704,74 @@ class GnssNetworkConnectivityHandler {
} }
} }
private int getLinkIpType(LinkProperties linkProperties) { private int getApnIpType(String apn) {
ensureInHandlerThread(); ensureInHandlerThread();
boolean isIPv4 = false; if (apn == null) {
boolean isIPv6 = false; return APN_INVALID;
}
List<LinkAddress> linkAddresses = linkProperties.getLinkAddresses(); TelephonyManager phone = (TelephonyManager)
for (LinkAddress linkAddress : linkAddresses) { mContext.getSystemService(Context.TELEPHONY_SERVICE);
InetAddress inetAddress = linkAddress.getAddress(); // During an emergency call with an active sub id, get the Telephony Manager specific
if (inetAddress instanceof Inet4Address) { // to the active sub to get the correct value from getServiceState and getNetworkType
isIPv4 = true; if (mNiHandler.getInEmergency() && mActiveSubId >= 0) {
} else if (inetAddress instanceof Inet6Address) { TelephonyManager subIdTelManager =
isIPv6 = true; phone.createForSubscriptionId(mActiveSubId);
if (subIdTelManager != null) {
phone = subIdTelManager;
} }
if (DEBUG) Log.d(TAG, "LinkAddress : " + inetAddress.toString()); }
ServiceState serviceState = phone.getServiceState();
String projection = null;
String selection = null;
// Carrier configuration may override framework roaming state, we need to use the actual
// modem roaming state instead of the framework roaming state.
if (serviceState != null && serviceState.getDataRoamingFromRegistration()) {
projection = Carriers.ROAMING_PROTOCOL;
} else {
projection = Carriers.PROTOCOL;
}
// No SIM case for emergency
if (TelephonyManager.NETWORK_TYPE_UNKNOWN == phone.getNetworkType()
&& AGPS_TYPE_EIMS == mAGpsType) {
selection = String.format(
"type like '%%emergency%%' and apn = '%s' and carrier_enabled = 1", apn);
} else {
selection = String.format("current = 1 and apn = '%s' and carrier_enabled = 1", apn);
}
try (Cursor cursor = mContext.getContentResolver().query(
Carriers.CONTENT_URI,
new String[]{projection},
selection,
null,
Carriers.DEFAULT_SORT_ORDER)) {
if (null != cursor && cursor.moveToFirst()) {
return translateToApnIpType(cursor.getString(0), apn);
} else {
Log.e(TAG, "No entry found in query for APN: " + apn);
}
} catch (Exception e) {
Log.e(TAG, "Error encountered on APN query for: " + apn, e);
} }
if (isIPv4 && isIPv6) { return APN_IPV4V6;
return APN_IPV4V6; }
}
if (isIPv4) { private int translateToApnIpType(String ipProtocol, String apn) {
if ("IP".equals(ipProtocol)) {
return APN_IPV4; return APN_IPV4;
} }
if (isIPv6) { if ("IPV6".equals(ipProtocol)) {
return APN_IPV6; return APN_IPV6;
} }
return APN_INVALID; if ("IPV4V6".equals(ipProtocol)) {
return APN_IPV4V6;
}
// we hit the default case so the ipProtocol is not recognized
String message = String.format("Unknown IP Protocol: %s, for APN: %s", ipProtocol, apn);
Log.e(TAG, message);
return APN_IPV4V6;
} }
// AGPS support // AGPS support