diff --git a/services/core/java/com/android/server/location/GnssConfiguration.java b/services/core/java/com/android/server/location/GnssConfiguration.java index bd6662d9dc516..aa51aec216ebc 100644 --- a/services/core/java/com/android/server/location/GnssConfiguration.java +++ b/services/core/java/com/android/server/location/GnssConfiguration.java @@ -317,8 +317,10 @@ class GnssConfiguration { if (configManager == null) { return; } - PersistableBundle configs = configManager.getConfigForSubId( - SubscriptionManager.getDefaultDataSubscriptionId()); + + int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); + PersistableBundle configs = SubscriptionManager.isValidSubscriptionId(ddSubId) + ? configManager.getConfigForSubId(ddSubId) : null; if (configs == null) { if (DEBUG) Log.d(TAG, "SIM not ready, use default carrier config."); configs = CarrierConfigManager.getDefaultConfig(); diff --git a/services/core/java/com/android/server/location/GnssLocationProvider.java b/services/core/java/com/android/server/location/GnssLocationProvider.java index 5b7eca6e310e0..b2315c7b7314b 100644 --- a/services/core/java/com/android/server/location/GnssLocationProvider.java +++ b/services/core/java/com/android/server/location/GnssLocationProvider.java @@ -60,7 +60,6 @@ import android.os.WorkSource.WorkChain; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionManager; -import android.telephony.SubscriptionManager.OnSubscriptionsChangedListener; import android.telephony.TelephonyManager; import android.telephony.gsm.GsmCellLocation; import android.text.TextUtils; @@ -75,6 +74,7 @@ import com.android.internal.location.GpsNetInitiatedHandler.GpsNiNotification; import com.android.internal.location.ProviderProperties; import com.android.internal.location.ProviderRequest; import com.android.internal.location.gnssmetrics.GnssMetrics; +import com.android.internal.telephony.TelephonyIntents; import com.android.server.location.GnssSatelliteBlacklistHelper.GnssSatelliteBlacklistCallback; import com.android.server.location.NtpTimeHelper.InjectNtpTimeCallback; @@ -184,7 +184,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements private static final int DOWNLOAD_PSDS_DATA = 6; private static final int UPDATE_LOCATION = 7; // Handle external location from network listener private static final int DOWNLOAD_PSDS_DATA_FINISHED = 11; - private static final int SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED = 12; private static final int INITIALIZE_HANDLER = 13; private static final int REQUEST_LOCATION = 16; private static final int REPORT_LOCATION = 17; // HAL reports location @@ -484,22 +483,13 @@ public class GnssLocationProvider extends AbstractLocationProvider implements updateLowPowerMode(); break; case CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED: + case TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED: subscriptionOrCarrierConfigChanged(context); break; } } }; - // TODO: replace OnSubscriptionsChangedListener with ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED - // broadcast receiver. - private final OnSubscriptionsChangedListener mOnSubscriptionsChangedListener = - new OnSubscriptionsChangedListener() { - @Override - public void onSubscriptionsChanged() { - sendMessage(SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED, 0, null); - } - }; - /** * Implements {@link GnssSatelliteBlacklistCallback#onUpdateSatelliteBlacklist}. */ @@ -515,12 +505,15 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mContext.getSystemService(Context.TELEPHONY_SERVICE); CarrierConfigManager configManager = (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE); - String mccMnc = phone.getSimOperator(); + int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); + String mccMnc = SubscriptionManager.isValidSubscriptionId(ddSubId) + ? phone.getSimOperator(ddSubId) : phone.getSimOperator(); boolean isKeepLppProfile = false; if (!TextUtils.isEmpty(mccMnc)) { if (DEBUG) Log.d(TAG, "SIM MCC/MNC is available: " + mccMnc); if (configManager != null) { - PersistableBundle b = configManager.getConfig(); + PersistableBundle b = SubscriptionManager.isValidSubscriptionId(ddSubId) + ? configManager.getConfigForSubId(ddSubId) : null; if (b != null) { isKeepLppProfile = b.getBoolean(CarrierConfigManager.Gps.KEY_PERSIST_LPP_MODE_BOOL); @@ -539,7 +532,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements SystemProperties.set(GnssConfiguration.LPP_PROFILE, ""); } reloadGpsProperties(); - mNIHandler.setSuplEsEnabled(mSuplEsEnabled); } else { if (DEBUG) Log.d(TAG, "SIM MCC/MNC is still not available"); } @@ -577,9 +569,9 @@ public class GnssLocationProvider extends AbstractLocationProvider implements mC2KServerPort = mGnssConfiguration.getC2KPort(TCP_MIN_PORT); mNIHandler.setEmergencyExtensionSeconds(mGnssConfiguration.getEsExtensionSec()); mSuplEsEnabled = mGnssConfiguration.getSuplEs(0) == 1; + mNIHandler.setSuplEsEnabled(mSuplEsEnabled); if (mGnssVisibilityControl != null) { - mGnssVisibilityControl.updateProxyApps(mGnssConfiguration.getProxyApps()); - mGnssVisibilityControl.setEsNotify(mGnssConfiguration.getEsNotify(0)); + mGnssVisibilityControl.onConfigurationUpdated(mGnssConfiguration); } } @@ -1892,28 +1884,34 @@ public class GnssLocationProvider extends AbstractLocationProvider implements TelephonyManager phone = (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); int type = AGPS_SETID_TYPE_NONE; - String data = ""; + String setId = null; + int ddSubId = SubscriptionManager.getDefaultDataSubscriptionId(); if ((flags & AGPS_RIL_REQUEST_SETID_IMSI) == AGPS_RIL_REQUEST_SETID_IMSI) { - String data_temp = phone.getSubscriberId(); - if (data_temp == null) { - // This means the framework does not have the SIM card ready. - } else { + if (SubscriptionManager.isValidSubscriptionId(ddSubId)) { + setId = phone.getSubscriberId(ddSubId); + } + if (setId == null) { + setId = phone.getSubscriberId(); + } + if (setId != null) { // This means the framework has the SIM card. - data = data_temp; type = AGPS_SETID_TYPE_IMSI; } } else if ((flags & AGPS_RIL_REQUEST_SETID_MSISDN) == AGPS_RIL_REQUEST_SETID_MSISDN) { - String data_temp = phone.getLine1Number(); - if (data_temp == null) { - // This means the framework does not have the SIM card ready. - } else { + if (SubscriptionManager.isValidSubscriptionId(ddSubId)) { + setId = phone.getLine1Number(ddSubId); + } + if (setId == null) { + setId = phone.getLine1Number(); + } + if (setId != null) { // This means the framework has the SIM card. - data = data_temp; type = AGPS_SETID_TYPE_MSISDN; } } - native_agps_set_id(type, data); + + native_agps_set_id(type, (setId == null) ? "" : setId); } @NativeEntryPoint @@ -2025,9 +2023,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements case UPDATE_LOCATION: handleUpdateLocation((Location) msg.obj); break; - case SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED: - subscriptionOrCarrierConfigChanged(mContext); - break; case INITIALIZE_HANDLER: handleInitialize(); break; @@ -2066,17 +2061,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements // (this configuration might change in the future based on SIM changes) reloadGpsProperties(); - // TODO: When this object "finishes" we should unregister by invoking - // SubscriptionManager.getInstance(mContext).unregister - // (mOnSubscriptionsChangedListener); - // This is not strictly necessary because it will be unregistered if the - // notification fails but it is good form. - - // Register for SubscriptionInfo list changes which is guaranteed - // to invoke onSubscriptionsChanged the first time. - SubscriptionManager.from(mContext) - .addOnSubscriptionsChangedListener(mOnSubscriptionsChangedListener); - // listen for events IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(ALARM_WAKEUP); @@ -2086,6 +2070,7 @@ public class GnssLocationProvider extends AbstractLocationProvider implements intentFilter.addAction(Intent.ACTION_SCREEN_OFF); intentFilter.addAction(Intent.ACTION_SCREEN_ON); intentFilter.addAction(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED); + intentFilter.addAction(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED); mContext.registerReceiver(mBroadcastReceiver, intentFilter, null, this); mNetworkConnectivityHandler.registerNetworkCallbacks(); @@ -2164,8 +2149,6 @@ public class GnssLocationProvider extends AbstractLocationProvider implements return "DOWNLOAD_PSDS_DATA_FINISHED"; case UPDATE_LOCATION: return "UPDATE_LOCATION"; - case SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED: - return "SUBSCRIPTION_OR_CARRIER_CONFIG_CHANGED"; case INITIALIZE_HANDLER: return "INITIALIZE_HANDLER"; case REPORT_LOCATION: diff --git a/services/core/java/com/android/server/location/GnssVisibilityControl.java b/services/core/java/com/android/server/location/GnssVisibilityControl.java index a3670a45d9cb9..c49d9000c1dd7 100644 --- a/services/core/java/com/android/server/location/GnssVisibilityControl.java +++ b/services/core/java/com/android/server/location/GnssVisibilityControl.java @@ -76,7 +76,7 @@ class GnssVisibilityControl { private final GpsNetInitiatedHandler mNiHandler; private boolean mIsGpsEnabled; - private volatile boolean mEsNotify; + private boolean mEsNotify; // Number of non-framework location access proxy apps is expected to be small (< 5). private static final int ARRAY_MAP_INITIAL_CAPACITY_PROXY_APP_TO_LOCATION_PERMISSIONS = 7; @@ -124,10 +124,6 @@ class GnssVisibilityControl { } } - void updateProxyApps(List nfwLocationAccessProxyApps) { - runOnHandler(() -> handleUpdateProxyApps(nfwLocationAccessProxyApps)); - } - void reportNfwNotification(String proxyAppPackageName, byte protocolStack, String otherProtocolStackName, byte requestor, String requestorId, byte responseType, boolean inEmergencyMode, boolean isCachedLocation) { @@ -136,15 +132,25 @@ class GnssVisibilityControl { requestor, requestorId, responseType, inEmergencyMode, isCachedLocation))); } - void setEsNotify(int esNotifyConfig) { - if (esNotifyConfig != ES_NOTIFY_NONE && esNotifyConfig != ES_NOTIFY_ALL) { + void onConfigurationUpdated(GnssConfiguration configuration) { + // The configuration object must be accessed only in the caller thread and not in mHandler. + List nfwLocationAccessProxyApps = configuration.getProxyApps(); + int esNotify = configuration.getEsNotify(ES_NOTIFY_NONE); + runOnHandler(() -> { + setEsNotify(esNotify); + handleUpdateProxyApps(nfwLocationAccessProxyApps); + }); + } + + private void setEsNotify(int esNotify) { + if (esNotify != ES_NOTIFY_NONE && esNotify != ES_NOTIFY_ALL) { Log.e(TAG, "Config parameter " + GnssConfiguration.CONFIG_ES_NOTIFY_INT - + " is set to invalid value: " + esNotifyConfig + + " is set to invalid value: " + esNotify + ". Using default value: " + ES_NOTIFY_NONE); - esNotifyConfig = ES_NOTIFY_NONE; + esNotify = ES_NOTIFY_NONE; } - mEsNotify = (esNotifyConfig == ES_NOTIFY_ALL); + mEsNotify = (esNotify == ES_NOTIFY_ALL); } private void handleInitialize() {