Loading flags/misc.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -206,3 +206,14 @@ flag { purpose: PURPOSE_BUGFIX } } # OWNER=rambowang TARGET=25Q2 flag { name: "support_carrier_services_for_hsum" namespace: "telephony" description: "Support Carrier Services (APIs) for HSUM." bug:"345522246" metadata { purpose: PURPOSE_BUGFIX } } src/java/com/android/internal/telephony/CarrierPrivilegesTracker.java +79 −14 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static android.telephony.TelephonyManager.SIM_STATE_UNKNOWN; import android.annotation.ElapsedRealtimeLong; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -66,6 +67,7 @@ import android.util.LocalLog; import android.util.Pair; import com.android.internal.annotations.GuardedBy; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.telephony.uicc.UiccPort; import com.android.internal.telephony.uicc.UiccProfile; Loading Loading @@ -93,6 +95,7 @@ import java.util.function.Function; * Registered Telephony entities will receive notifications when the UIDs with these privileges * change. */ @SuppressLint("MissingPermission") public class CarrierPrivilegesTracker extends Handler { private static final String TAG = CarrierPrivilegesTracker.class.getSimpleName(); Loading Loading @@ -223,6 +226,9 @@ public class CarrierPrivilegesTracker extends Handler { "mPrivilegedPackageInfoLock.writeLock()"}) private boolean mSimIsReadyButNotLoaded = false; @NonNull private final FeatureFlags mFeatureFlags; /** Small snapshot to hold package names and UIDs of privileged packages. */ private static final class PrivilegedPackageInfo { @NonNull final Set<String> mPackageNames; Loading Loading @@ -316,7 +322,7 @@ public class CarrierPrivilegesTracker extends Handler { boolean notExist = false; try { disabledByUser = action.equals(Intent.ACTION_PACKAGE_CHANGED) && mPackageManager.getApplicationEnabledSetting(pkgName) && getApplicationEnabledSetting(pkgName) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; } catch (IllegalArgumentException iae) { // Very rare case when package changed race with package removed Loading @@ -336,10 +342,11 @@ public class CarrierPrivilegesTracker extends Handler { } }; public CarrierPrivilegesTracker( @NonNull Looper looper, @NonNull Phone phone, @NonNull Context context) { public CarrierPrivilegesTracker(@NonNull Looper looper, @NonNull Phone phone, @NonNull Context context, @NonNull FeatureFlags flags) { super(looper); mContext = context; mFeatureFlags = flags; mPhone = phone; mPackageManager = mContext.getPackageManager(); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); Loading @@ -359,7 +366,13 @@ public class CarrierPrivilegesTracker extends Handler { IntentFilter certFilter = new IntentFilter(); certFilter.addAction(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED); certFilter.addAction(TelephonyManager.ACTION_SIM_APPLICATION_STATE_CHANGED); if (mFeatureFlags.supportCarrierServicesForHsum()) { mContext.registerReceiverAsUser( mIntentReceiver, UserHandle.of(ActivityManager.getCurrentUser()), certFilter, /* broadcastPermission= */ null, /* scheduler= */ null); } else { mContext.registerReceiver(mIntentReceiver, certFilter); } IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); Loading @@ -370,7 +383,13 @@ public class CarrierPrivilegesTracker extends Handler { // For package-related broadcasts, specify the data scheme for "package" to receive the // package name along with the broadcast packageFilter.addDataScheme("package"); if (mFeatureFlags.supportCarrierServicesForHsum()) { mContext.registerReceiverAsUser( mIntentReceiver, UserHandle.of(ActivityManager.getCurrentUser()), packageFilter, /* broadcastPermission= */ null, /* scheduler= */ null); } else { mContext.registerReceiver(mIntentReceiver, packageFilter); } sendMessage(obtainMessage(ACTION_INITIALIZE_TRACKER)); } Loading Loading @@ -542,7 +561,14 @@ public class CarrierPrivilegesTracker extends Handler { PackageInfo pkg; try { pkg = mPackageManager.getPackageInfo(pkgName, INSTALLED_PACKAGES_QUERY_FLAGS); pkg = mFeatureFlags.supportCarrierServicesForHsum() ? mPackageManager.getPackageInfoAsUser( pkgName, INSTALLED_PACKAGES_QUERY_FLAGS, ActivityManager.getCurrentUser()) : mPackageManager.getPackageInfo( pkgName, INSTALLED_PACKAGES_QUERY_FLAGS); } catch (NameNotFoundException e) { Rlog.e(TAG, "Error getting installed package: " + pkgName, e); return; Loading Loading @@ -620,7 +646,10 @@ public class CarrierPrivilegesTracker extends Handler { private void refreshInstalledPackageCache() { List<PackageInfo> installedPackages = mPackageManager.getInstalledPackagesAsUser( INSTALLED_PACKAGES_QUERY_FLAGS, UserHandle.SYSTEM.getIdentifier()); INSTALLED_PACKAGES_QUERY_FLAGS, mFeatureFlags.supportCarrierServicesForHsum() ? ActivityManager.getCurrentUser() : UserHandle.SYSTEM.getIdentifier()); for (PackageInfo pkg : installedPackages) { updateCertsForPackage(pkg); // This may be unnecessary before initialization, but invalidate the cache all the time Loading Loading @@ -794,7 +823,9 @@ public class CarrierPrivilegesTracker extends Handler { private int getPackageUid(@Nullable String pkgName) { int uid = Process.INVALID_UID; try { uid = mPackageManager.getPackageUid(pkgName, /* flags= */0); uid = mFeatureFlags.supportCarrierServicesForHsum() ? mPackageManager.getPackageUidAsUser(pkgName, ActivityManager.getCurrentUser()) : mPackageManager.getPackageUid(pkgName, /* flags= */0); } catch (NameNotFoundException e) { Rlog.e(TAG, "Unable to find uid for package " + pkgName); } Loading Loading @@ -994,10 +1025,25 @@ public class CarrierPrivilegesTracker extends Handler { // Do the PackageManager queries before we take the lock, as these are the longest-running // pieces of this method and don't depend on the set of carrier apps. List<ResolveInfo> resolveInfos = new ArrayList<>(); if (mFeatureFlags.supportCarrierServicesForHsum()) { resolveInfos.addAll( mPackageManager.queryBroadcastReceiversAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); resolveInfos.addAll( mPackageManager.queryIntentActivitiesAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); resolveInfos.addAll( mPackageManager.queryIntentServicesAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); resolveInfos.addAll( mPackageManager.queryIntentContentProvidersAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); } else { resolveInfos.addAll(mPackageManager.queryBroadcastReceivers(intent, 0)); resolveInfos.addAll(mPackageManager.queryIntentActivities(intent, 0)); resolveInfos.addAll(mPackageManager.queryIntentServices(intent, 0)); resolveInfos.addAll(mPackageManager.queryIntentContentProviders(intent, 0)); } // Now actually check which of the resolved packages have carrier privileges. mPrivilegedPackageInfoLock.readLock().lock(); Loading Loading @@ -1031,8 +1077,15 @@ public class CarrierPrivilegesTracker extends Handler { @NonNull private Pair<String, Integer> getCarrierService(@NonNull Set<String> simPrivilegedPackages) { List<ResolveInfo> carrierServiceResolveInfos = mPackageManager.queryIntentServices( new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), /* flags= */ 0); List<ResolveInfo> carrierServiceResolveInfos = mFeatureFlags.supportCarrierServicesForHsum() ? mPackageManager.queryIntentServicesAsUser( new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), /* flags= */ 0, ActivityManager.getCurrentUser()) : mPackageManager.queryIntentServices( new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), /* flags= */ 0); String carrierServicePackageName = null; for (ResolveInfo resolveInfo : carrierServiceResolveInfos) { String packageName = getPackageName(resolveInfo); Loading @@ -1050,4 +1103,16 @@ public class CarrierPrivilegesTracker extends Handler { ? new Pair<>(null, Process.INVALID_UID) : new Pair<>(carrierServicePackageName, getPackageUid(carrierServicePackageName)); } private @PackageManager.EnabledState int getApplicationEnabledSetting( @NonNull String packageName) { if (mFeatureFlags.supportCarrierServicesForHsum()) { return mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /* flags= */ 0) .getPackageManager() .getApplicationEnabledSetting(packageName); } else { return mPackageManager.getApplicationEnabledSetting(packageName); } } } src/java/com/android/internal/telephony/CarrierServiceBindHelper.java +2 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import android.util.Log; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.util.TelephonyUtils; import java.io.FileDescriptor; Loading Loading @@ -171,7 +172,7 @@ public class CarrierServiceBindHelper { context, mHandler.getLooper(), UserHandle.ALL); try { Context contextAsUser = mContext.createPackageContextAsUser(mContext.getPackageName(), 0, UserHandle.SYSTEM); 0, Flags.supportCarrierServicesForHsum() ? UserHandle.CURRENT : UserHandle.SYSTEM); contextAsUser.registerReceiver(mUserUnlockedReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED), null /* broadcastPermission */, mHandler); Loading src/java/com/android/internal/telephony/Connection.java +32 −3 Original line number Diff line number Diff line Loading @@ -694,6 +694,16 @@ public abstract class Connection { int eccCategory = dialArgs.intentExtras.getInt( PhoneConstants.EXTRA_EMERGENCY_SERVICE_CATEGORY, mEmergencyNumberInfo.getEmergencyServiceCategoryBitmask()); // According to 3gpp 23.167 section 7.1.2, when CS domain is selected, // emergency routing is performed only if the emergency category is provided. if (this instanceof GsmCdmaConnection && dialArgs.intentExtras.getInt( PhoneConstants.EXTRA_EMERGENCY_SERVICE_CATEGORY, EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED) == EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED) { Rlog.d(TAG, "setEmergencyCallInfo: specific eccCategory is required"); return; } Rlog.d(TAG, "setEmergencyCallInfo: enforce emergency routing eccCategory=" + eccCategory); List<String> emergencyUrns = dialArgs.intentExtras.getStringArrayList( Loading @@ -706,12 +716,31 @@ public abstract class Connection { mEmergencyNumberInfo.getMnc(), eccCategory, emergencyUrns, mEmergencyNumberInfo.getEmergencyNumberSourceBitmask(), getEmergencyNumberSourceForEmergencyRouting(), EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY); } } } /** * Get the emergency number source to be used for emergency routing calls. * This is not getting actual source, instead its forcing the source to * EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING. * Even when the source is EMERGENCY_NUMBER_SOURCE_DATABASE, * to allow the category information delivered by the network to be used, * the source is set to EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING. */ private int getEmergencyNumberSourceForEmergencyRouting() { int source = mEmergencyNumberInfo.getEmergencyNumberSourceBitmask(); Rlog.d(TAG, "getEmergencyNumberSourceForEmergencyRouting: source=" + source); if (source != EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST) { source = EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING; } return source; } /** * Set the non-detectable emergency number information. */ Loading src/java/com/android/internal/telephony/GsmCdmaConnection.java +2 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.telephony.CarrierConfigManager; import android.telephony.DisconnectCause; import android.telephony.PhoneNumberUtils; import android.telephony.ServiceState; import android.telephony.emergency.EmergencyNumber; import android.text.TextUtils; import com.android.internal.telephony.PhoneInternalInterface.DialArgs; Loading Loading @@ -186,7 +187,7 @@ public class GsmCdmaConnection extends Connection { mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); if (dialArgs.isEmergency) { setEmergencyCallInfo(mOwner, null); setEmergencyCallInfo(mOwner, dialArgs); // There was no emergency number info found for this call, however it is // still marked as an emergency number. This may happen if it was a redialed Loading Loading
flags/misc.aconfig +11 −0 Original line number Diff line number Diff line Loading @@ -206,3 +206,14 @@ flag { purpose: PURPOSE_BUGFIX } } # OWNER=rambowang TARGET=25Q2 flag { name: "support_carrier_services_for_hsum" namespace: "telephony" description: "Support Carrier Services (APIs) for HSUM." bug:"345522246" metadata { purpose: PURPOSE_BUGFIX } }
src/java/com/android/internal/telephony/CarrierPrivilegesTracker.java +79 −14 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import static android.telephony.TelephonyManager.SIM_STATE_UNKNOWN; import android.annotation.ElapsedRealtimeLong; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.SuppressLint; import android.app.ActivityManager; import android.content.BroadcastReceiver; import android.content.Context; Loading Loading @@ -66,6 +67,7 @@ import android.util.LocalLog; import android.util.Pair; import com.android.internal.annotations.GuardedBy; import com.android.internal.telephony.flags.FeatureFlags; import com.android.internal.telephony.uicc.IccUtils; import com.android.internal.telephony.uicc.UiccPort; import com.android.internal.telephony.uicc.UiccProfile; Loading Loading @@ -93,6 +95,7 @@ import java.util.function.Function; * Registered Telephony entities will receive notifications when the UIDs with these privileges * change. */ @SuppressLint("MissingPermission") public class CarrierPrivilegesTracker extends Handler { private static final String TAG = CarrierPrivilegesTracker.class.getSimpleName(); Loading Loading @@ -223,6 +226,9 @@ public class CarrierPrivilegesTracker extends Handler { "mPrivilegedPackageInfoLock.writeLock()"}) private boolean mSimIsReadyButNotLoaded = false; @NonNull private final FeatureFlags mFeatureFlags; /** Small snapshot to hold package names and UIDs of privileged packages. */ private static final class PrivilegedPackageInfo { @NonNull final Set<String> mPackageNames; Loading Loading @@ -316,7 +322,7 @@ public class CarrierPrivilegesTracker extends Handler { boolean notExist = false; try { disabledByUser = action.equals(Intent.ACTION_PACKAGE_CHANGED) && mPackageManager.getApplicationEnabledSetting(pkgName) && getApplicationEnabledSetting(pkgName) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; } catch (IllegalArgumentException iae) { // Very rare case when package changed race with package removed Loading @@ -336,10 +342,11 @@ public class CarrierPrivilegesTracker extends Handler { } }; public CarrierPrivilegesTracker( @NonNull Looper looper, @NonNull Phone phone, @NonNull Context context) { public CarrierPrivilegesTracker(@NonNull Looper looper, @NonNull Phone phone, @NonNull Context context, @NonNull FeatureFlags flags) { super(looper); mContext = context; mFeatureFlags = flags; mPhone = phone; mPackageManager = mContext.getPackageManager(); mUserManager = (UserManager) mContext.getSystemService(Context.USER_SERVICE); Loading @@ -359,7 +366,13 @@ public class CarrierPrivilegesTracker extends Handler { IntentFilter certFilter = new IntentFilter(); certFilter.addAction(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED); certFilter.addAction(TelephonyManager.ACTION_SIM_APPLICATION_STATE_CHANGED); if (mFeatureFlags.supportCarrierServicesForHsum()) { mContext.registerReceiverAsUser( mIntentReceiver, UserHandle.of(ActivityManager.getCurrentUser()), certFilter, /* broadcastPermission= */ null, /* scheduler= */ null); } else { mContext.registerReceiver(mIntentReceiver, certFilter); } IntentFilter packageFilter = new IntentFilter(); packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED); Loading @@ -370,7 +383,13 @@ public class CarrierPrivilegesTracker extends Handler { // For package-related broadcasts, specify the data scheme for "package" to receive the // package name along with the broadcast packageFilter.addDataScheme("package"); if (mFeatureFlags.supportCarrierServicesForHsum()) { mContext.registerReceiverAsUser( mIntentReceiver, UserHandle.of(ActivityManager.getCurrentUser()), packageFilter, /* broadcastPermission= */ null, /* scheduler= */ null); } else { mContext.registerReceiver(mIntentReceiver, packageFilter); } sendMessage(obtainMessage(ACTION_INITIALIZE_TRACKER)); } Loading Loading @@ -542,7 +561,14 @@ public class CarrierPrivilegesTracker extends Handler { PackageInfo pkg; try { pkg = mPackageManager.getPackageInfo(pkgName, INSTALLED_PACKAGES_QUERY_FLAGS); pkg = mFeatureFlags.supportCarrierServicesForHsum() ? mPackageManager.getPackageInfoAsUser( pkgName, INSTALLED_PACKAGES_QUERY_FLAGS, ActivityManager.getCurrentUser()) : mPackageManager.getPackageInfo( pkgName, INSTALLED_PACKAGES_QUERY_FLAGS); } catch (NameNotFoundException e) { Rlog.e(TAG, "Error getting installed package: " + pkgName, e); return; Loading Loading @@ -620,7 +646,10 @@ public class CarrierPrivilegesTracker extends Handler { private void refreshInstalledPackageCache() { List<PackageInfo> installedPackages = mPackageManager.getInstalledPackagesAsUser( INSTALLED_PACKAGES_QUERY_FLAGS, UserHandle.SYSTEM.getIdentifier()); INSTALLED_PACKAGES_QUERY_FLAGS, mFeatureFlags.supportCarrierServicesForHsum() ? ActivityManager.getCurrentUser() : UserHandle.SYSTEM.getIdentifier()); for (PackageInfo pkg : installedPackages) { updateCertsForPackage(pkg); // This may be unnecessary before initialization, but invalidate the cache all the time Loading Loading @@ -794,7 +823,9 @@ public class CarrierPrivilegesTracker extends Handler { private int getPackageUid(@Nullable String pkgName) { int uid = Process.INVALID_UID; try { uid = mPackageManager.getPackageUid(pkgName, /* flags= */0); uid = mFeatureFlags.supportCarrierServicesForHsum() ? mPackageManager.getPackageUidAsUser(pkgName, ActivityManager.getCurrentUser()) : mPackageManager.getPackageUid(pkgName, /* flags= */0); } catch (NameNotFoundException e) { Rlog.e(TAG, "Unable to find uid for package " + pkgName); } Loading Loading @@ -994,10 +1025,25 @@ public class CarrierPrivilegesTracker extends Handler { // Do the PackageManager queries before we take the lock, as these are the longest-running // pieces of this method and don't depend on the set of carrier apps. List<ResolveInfo> resolveInfos = new ArrayList<>(); if (mFeatureFlags.supportCarrierServicesForHsum()) { resolveInfos.addAll( mPackageManager.queryBroadcastReceiversAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); resolveInfos.addAll( mPackageManager.queryIntentActivitiesAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); resolveInfos.addAll( mPackageManager.queryIntentServicesAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); resolveInfos.addAll( mPackageManager.queryIntentContentProvidersAsUser( intent, /* flags= */ 0, ActivityManager.getCurrentUser())); } else { resolveInfos.addAll(mPackageManager.queryBroadcastReceivers(intent, 0)); resolveInfos.addAll(mPackageManager.queryIntentActivities(intent, 0)); resolveInfos.addAll(mPackageManager.queryIntentServices(intent, 0)); resolveInfos.addAll(mPackageManager.queryIntentContentProviders(intent, 0)); } // Now actually check which of the resolved packages have carrier privileges. mPrivilegedPackageInfoLock.readLock().lock(); Loading Loading @@ -1031,8 +1077,15 @@ public class CarrierPrivilegesTracker extends Handler { @NonNull private Pair<String, Integer> getCarrierService(@NonNull Set<String> simPrivilegedPackages) { List<ResolveInfo> carrierServiceResolveInfos = mPackageManager.queryIntentServices( new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), /* flags= */ 0); List<ResolveInfo> carrierServiceResolveInfos = mFeatureFlags.supportCarrierServicesForHsum() ? mPackageManager.queryIntentServicesAsUser( new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), /* flags= */ 0, ActivityManager.getCurrentUser()) : mPackageManager.queryIntentServices( new Intent(CarrierService.CARRIER_SERVICE_INTERFACE), /* flags= */ 0); String carrierServicePackageName = null; for (ResolveInfo resolveInfo : carrierServiceResolveInfos) { String packageName = getPackageName(resolveInfo); Loading @@ -1050,4 +1103,16 @@ public class CarrierPrivilegesTracker extends Handler { ? new Pair<>(null, Process.INVALID_UID) : new Pair<>(carrierServicePackageName, getPackageUid(carrierServicePackageName)); } private @PackageManager.EnabledState int getApplicationEnabledSetting( @NonNull String packageName) { if (mFeatureFlags.supportCarrierServicesForHsum()) { return mContext.createContextAsUser( UserHandle.of(ActivityManager.getCurrentUser()), /* flags= */ 0) .getPackageManager() .getApplicationEnabledSetting(packageName); } else { return mPackageManager.getApplicationEnabledSetting(packageName); } } }
src/java/com/android/internal/telephony/CarrierServiceBindHelper.java +2 −1 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import android.util.Log; import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.flags.Flags; import com.android.internal.telephony.util.TelephonyUtils; import java.io.FileDescriptor; Loading Loading @@ -171,7 +172,7 @@ public class CarrierServiceBindHelper { context, mHandler.getLooper(), UserHandle.ALL); try { Context contextAsUser = mContext.createPackageContextAsUser(mContext.getPackageName(), 0, UserHandle.SYSTEM); 0, Flags.supportCarrierServicesForHsum() ? UserHandle.CURRENT : UserHandle.SYSTEM); contextAsUser.registerReceiver(mUserUnlockedReceiver, new IntentFilter(Intent.ACTION_USER_UNLOCKED), null /* broadcastPermission */, mHandler); Loading
src/java/com/android/internal/telephony/Connection.java +32 −3 Original line number Diff line number Diff line Loading @@ -694,6 +694,16 @@ public abstract class Connection { int eccCategory = dialArgs.intentExtras.getInt( PhoneConstants.EXTRA_EMERGENCY_SERVICE_CATEGORY, mEmergencyNumberInfo.getEmergencyServiceCategoryBitmask()); // According to 3gpp 23.167 section 7.1.2, when CS domain is selected, // emergency routing is performed only if the emergency category is provided. if (this instanceof GsmCdmaConnection && dialArgs.intentExtras.getInt( PhoneConstants.EXTRA_EMERGENCY_SERVICE_CATEGORY, EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED) == EmergencyNumber.EMERGENCY_SERVICE_CATEGORY_UNSPECIFIED) { Rlog.d(TAG, "setEmergencyCallInfo: specific eccCategory is required"); return; } Rlog.d(TAG, "setEmergencyCallInfo: enforce emergency routing eccCategory=" + eccCategory); List<String> emergencyUrns = dialArgs.intentExtras.getStringArrayList( Loading @@ -706,12 +716,31 @@ public abstract class Connection { mEmergencyNumberInfo.getMnc(), eccCategory, emergencyUrns, mEmergencyNumberInfo.getEmergencyNumberSourceBitmask(), getEmergencyNumberSourceForEmergencyRouting(), EmergencyNumber.EMERGENCY_CALL_ROUTING_EMERGENCY); } } } /** * Get the emergency number source to be used for emergency routing calls. * This is not getting actual source, instead its forcing the source to * EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING. * Even when the source is EMERGENCY_NUMBER_SOURCE_DATABASE, * to allow the category information delivered by the network to be used, * the source is set to EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING. */ private int getEmergencyNumberSourceForEmergencyRouting() { int source = mEmergencyNumberInfo.getEmergencyNumberSourceBitmask(); Rlog.d(TAG, "getEmergencyNumberSourceForEmergencyRouting: source=" + source); if (source != EmergencyNumber.EMERGENCY_NUMBER_SOURCE_TEST) { source = EmergencyNumber.EMERGENCY_NUMBER_SOURCE_NETWORK_SIGNALING; } return source; } /** * Set the non-detectable emergency number information. */ Loading
src/java/com/android/internal/telephony/GsmCdmaConnection.java +2 −1 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ import android.telephony.CarrierConfigManager; import android.telephony.DisconnectCause; import android.telephony.PhoneNumberUtils; import android.telephony.ServiceState; import android.telephony.emergency.EmergencyNumber; import android.text.TextUtils; import com.android.internal.telephony.PhoneInternalInterface.DialArgs; Loading Loading @@ -186,7 +187,7 @@ public class GsmCdmaConnection extends Connection { mAddress = PhoneNumberUtils.extractNetworkPortionAlt(dialString); if (dialArgs.isEmergency) { setEmergencyCallInfo(mOwner, null); setEmergencyCallInfo(mOwner, dialArgs); // There was no emergency number info found for this call, however it is // still marked as an emergency number. This may happen if it was a redialed Loading