Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1ed5b93c authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 12397640 from 98813474 to 24Q4-release

Change-Id: Id3bcbc7abde828a16a1ae8b7e061e2850535543d
parents e12c90fd 98813474
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -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
    }
}
+79 −14
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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();

@@ -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;
@@ -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
@@ -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);
@@ -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);
@@ -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));
    }
@@ -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;
@@ -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
@@ -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);
        }
@@ -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();
@@ -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);
@@ -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);
        }
    }
}
+2 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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);
+32 −3
Original line number Diff line number Diff line
@@ -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(
@@ -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.
     */
+2 −1
Original line number Diff line number Diff line
@@ -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;
@@ -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