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

Commit ec2b2663 authored by Sangyun Yun's avatar Sangyun Yun Committed by Android (Google) Code Review
Browse files

Merge "Collect and process provisioning items to call updateImsServiceConfig" into main

parents 87af5b32 3dd6af6a
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -20,3 +20,10 @@ flag {
    description: "This flag clears cached IMS phone number when device lost IMS registration"
    bug:"288002989"
}

flag {
    name: "update_ims_service_by_gathering_provisioning_changes"
    namespace: "telephony"
    description: "This flag is created to prevent unnecessary updates when multiple provisioning items to update ims service are changed."
    bug:"302281114"
}
+21 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import com.android.internal.telephony.data.LinkBandwidthEstimator;
import com.android.internal.telephony.data.PhoneSwitcher;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.flags.FeatureFlagsImpl;
import com.android.internal.telephony.imsphone.ImsExternalCallTracker;
import com.android.internal.telephony.imsphone.ImsNrSaModeHandler;
import com.android.internal.telephony.imsphone.ImsPhone;
@@ -382,8 +383,27 @@ public class TelephonyComponentFactory {
        return new InboundSmsTracker(context, cursor, isCurrentFormat3gpp2);
    }

    /**
     * Create an ImsPhoneCallTracker.
     *
     * @param imsPhone imsphone
     * @return ImsPhoneCallTracker newly created ImsPhoneCallTracker
     * @deprecated Use {@link #makeImsPhoneCallTracker(ImsPhone, FeatureFlags)} instead
     */
    public ImsPhoneCallTracker makeImsPhoneCallTracker(ImsPhone imsPhone) {
        return new ImsPhoneCallTracker(imsPhone, ImsManager::getConnector);
        return makeImsPhoneCallTracker(imsPhone, new FeatureFlagsImpl());
    }

    /**
     * Create a ims phone call tracker.
     *
     * @param imsPhone imsphone
     * @param featureFlags feature flags
     * @return ImsPhoneCallTracker newly created ImsPhoneCallTracker
     */
    public ImsPhoneCallTracker makeImsPhoneCallTracker(ImsPhone imsPhone,
                                                       @NonNull FeatureFlags featureFlags) {
        return new ImsPhoneCallTracker(imsPhone, ImsManager::getConnector, featureFlags);
    }

    public ImsExternalCallTracker makeImsExternalCallTracker(ImsPhone imsPhone) {
+1 −1
Original line number Diff line number Diff line
@@ -484,7 +484,7 @@ public class ImsPhone extends ImsPhoneBase {
                        .inject(ImsNrSaModeHandler.class.getName())
                        .makeImsNrSaModeHandler(this);
        mCT = TelephonyComponentFactory.getInstance().inject(ImsPhoneCallTracker.class.getName())
                .makeImsPhoneCallTracker(this);
                .makeImsPhoneCallTracker(this, featureFlags);
        mCT.registerPhoneStateListener(mExternalCallTracker);
        mExternalCallTracker.setCallPuller(mCT);

+136 −32
Original line number Diff line number Diff line
@@ -148,6 +148,7 @@ import com.android.internal.telephony.data.DataSettingsManager;
import com.android.internal.telephony.domainselection.DomainSelectionResolver;
import com.android.internal.telephony.emergency.EmergencyNumberTracker;
import com.android.internal.telephony.emergency.EmergencyStateTracker;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.gsm.SuppServiceNotification;
import com.android.internal.telephony.imsphone.ImsPhone.ImsDialArgs;
import com.android.internal.telephony.metrics.CallQualityMetrics;
@@ -664,6 +665,7 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
    private static final int EVENT_START_IMS_TRAFFIC_DONE = 33;
    private static final int EVENT_CONNECTION_SETUP_FAILURE = 34;
    private static final int EVENT_NEW_ACTIVE_CALL_STARTED = 35;
    private static final int EVENT_PROVISIONING_CHANGED = 36;

    private static final int TIMEOUT_HANGUP_PENDINGMO = 500;

@@ -673,6 +675,8 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {

    private static final int TIMEOUT_PARTICIPANT_CONNECT_TIME_CACHE_MS = 60000; //ms

    private static final int DELAY_STACKING_PROVISIONING_CHANGES_MILLIS = 50; //ms

    // Following values are for mHoldSwitchingState
    private enum HoldSwapState {
        // Not in the middle of a hold/swap operation
@@ -1235,17 +1239,39 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        }
    }

    private final ConcurrentLinkedQueue<ProvisioningItem> mProvisioningItemQueue =
            new ConcurrentLinkedQueue<>();

    private static class ProvisioningItem {
        final int mItem;
        final Object mValue;
        ProvisioningItem(int item, int value) {
            this.mItem = item;
            this.mValue = Integer.valueOf(value);
        }

        ProvisioningItem(int item, String value) {
            this.mItem = item;
            this.mValue = value;
        }
    }

    private @NonNull final FeatureFlags mFeatureFlags;

    //***** Events


    //***** Constructors
    public ImsPhoneCallTracker(ImsPhone phone, ConnectorFactory factory) {
        this(phone, factory, phone.getContext().getMainExecutor());
    public ImsPhoneCallTracker(ImsPhone phone, ConnectorFactory factory,
            FeatureFlags featureFlags) {
        this(phone, factory, phone.getContext().getMainExecutor(), featureFlags);
    }

    @VisibleForTesting
    public ImsPhoneCallTracker(ImsPhone phone, ConnectorFactory factory, Executor executor) {
    public ImsPhoneCallTracker(ImsPhone phone, ConnectorFactory factory, Executor executor,
            FeatureFlags featureFlags) {
        this.mPhone = phone;
        mFeatureFlags = featureFlags;
        mConnectorFactory = factory;
        if (executor != null) {
            mExecutor = executor;
@@ -4592,32 +4618,62 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
            new ProvisioningManager.Callback() {
                @Override
                public void onProvisioningIntChanged(int item, int value) {
                    // if updateImsServiceByGatheringProvisioningChanges feature is enabled,
                    // Provisioning items are processed all at once by queuing and sending message.
                    if (mFeatureFlags.updateImsServiceByGatheringProvisioningChanges()) {
                        queueAndSendProvisioningChanged(new ProvisioningItem(item, value));
                        return;
                    }
                    // run belows when updateImsServiceByGatheringProvisioningChanges feature is
                    // disabled only

                    sendConfigChangedIntent(item, Integer.toString(value));
                    if ((mImsManager != null)
                            && (item == ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED
                            || item == ImsConfig.ConfigConstants.VLT_SETTING_ENABLED
                            || item == ImsConfig.ConfigConstants.LVC_SETTING_ENABLED)) {
                // Update Ims Service state to make sure updated provisioning values take effect
                // immediately.
                        // Update Ims Service state to make sure updated provisioning values take
                        // effect immediately.
                        updateImsServiceConfig();
                    }
                }

                @Override
                public void onProvisioningStringChanged(int item, String value) {
                    if (mFeatureFlags.updateImsServiceByGatheringProvisioningChanges()) {
                        queueAndSendProvisioningChanged(new ProvisioningItem(item, value));
                        return;
                    }
                    // run belows when updateImsServiceByGatheringProvisioningChanges feature is
                    // disabled only

                    sendConfigChangedIntent(item, value);
                }

        // send IMS_CONFIG_CHANGED intent for older services that do not implement the new callback
        // interface.
                // send IMS_CONFIG_CHANGED intent for older services that do not implement the new
                // callback interface.
                private void sendConfigChangedIntent(int item, String value) {
                    log("sendConfigChangedIntent - [" + item + ", " + value + "]");
                    Intent configChangedIntent = new Intent(ImsConfig.ACTION_IMS_CONFIG_CHANGED);
                    configChangedIntent.putExtra(ImsConfig.EXTRA_CHANGED_ITEM, item);
                    configChangedIntent.putExtra(ImsConfig.EXTRA_NEW_VALUE, value);
                    if (mPhone != null && mPhone.getContext() != null) {
                mPhone.getContext().sendBroadcast(
                        configChangedIntent, Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
                        mPhone.getContext().sendBroadcast(configChangedIntent,
                                Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
                    }
                }

                private void queueAndSendProvisioningChanged(ProvisioningItem provisioningItem) {
                    if (!mFeatureFlags.updateImsServiceByGatheringProvisioningChanges()) {
                        return;
                    }

                    boolean bQueueOffer = mProvisioningItemQueue.offer(provisioningItem);
                    // Checks the Handler Message Queue and schedules a new message with small delay
                    // to avoid stacking multiple redundant event only if it doesn't exist.
                    if (bQueueOffer && !hasMessages(EVENT_PROVISIONING_CHANGED)) {
                        sendMessageDelayed(obtainMessage(EVENT_PROVISIONING_CHANGED),
                                DELAY_STACKING_PROVISIONING_CHANGES_MILLIS);
                    }
                }
            };
@@ -5011,6 +5067,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
                }
                break;
            }

            case EVENT_PROVISIONING_CHANGED: {
                handleProvisioningChanged();
                break;
            }
        }
    }

@@ -6210,4 +6271,47 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall {
        mImsTrafficSessions.forEachKey(1, token -> mPhone.stopImsTraffic(token, null));
        mImsTrafficSessions.clear();
    }

    /**
     * Process provisioning changes all at once.
     */
    private void handleProvisioningChanged() {
        boolean bNeedUpdateImsServiceConfig = false;
        ProvisioningItem provisioningItem;
        while ((provisioningItem = mProvisioningItemQueue.poll()) != null) {
            int item = provisioningItem.mItem;
            if (provisioningItem.mValue instanceof Integer) {
                sendConfigChangedIntent(item, provisioningItem.mValue.toString());
                if (item == ImsConfig.ConfigConstants.VOICE_OVER_WIFI_SETTING_ENABLED
                        || item == ImsConfig.ConfigConstants.VLT_SETTING_ENABLED
                        || item == ImsConfig.ConfigConstants.LVC_SETTING_ENABLED) {
                    bNeedUpdateImsServiceConfig = true;
                }
            } else if (provisioningItem.mValue instanceof String) {
                sendConfigChangedIntent(item, provisioningItem.mValue.toString());
            }
        }
        if (bNeedUpdateImsServiceConfig) {
            // Update Ims Service state to make sure updated provisioning values take effect.
            updateImsServiceConfig();
        }
    }

    /**
     * send IMS_CONFIG_CHANGED intent for older services that do not implement the new callback
     * interface
     *
     * @param item provisioning item
     * @param value provisioning value
     */
    private void sendConfigChangedIntent(int item, String value) {
        log("sendConfigChangedIntent - [" + item + ", " + value + "]");
        Intent configChangedIntent = new Intent(ImsConfig.ACTION_IMS_CONFIG_CHANGED);
        configChangedIntent.putExtra(ImsConfig.EXTRA_CHANGED_ITEM, item);
        configChangedIntent.putExtra(ImsConfig.EXTRA_NEW_VALUE, value);
        if (mPhone != null && mPhone.getContext() != null) {
            mPhone.getContext().sendBroadcast(
                    configChangedIntent, Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -597,7 +597,7 @@ public abstract class TelephonyTest {
        doReturn(mWspTypeDecoder).when(mTelephonyComponentFactory)
                .makeWspTypeDecoder(nullable(byte[].class));
        doReturn(mImsCT).when(mTelephonyComponentFactory)
                .makeImsPhoneCallTracker(nullable(ImsPhone.class));
                .makeImsPhoneCallTracker(nullable(ImsPhone.class), any(FeatureFlags.class));
        doReturn(mCdmaSSM).when(mTelephonyComponentFactory)
                .getCdmaSubscriptionSourceManagerInstance(nullable(Context.class),
                        nullable(CommandsInterface.class), nullable(Handler.class),
Loading