Loading flags/ims.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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" } src/java/com/android/internal/telephony/TelephonyComponentFactory.java +21 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading src/java/com/android/internal/telephony/imsphone/ImsPhone.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +136 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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); } } }; Loading Loading @@ -5011,6 +5067,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { } break; } case EVENT_PROVISIONING_CHANGED: { handleProvisioningChanged(); break; } } } Loading Loading @@ -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); } } } tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
flags/ims.aconfig +7 −0 Original line number Diff line number Diff line Loading @@ -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" }
src/java/com/android/internal/telephony/TelephonyComponentFactory.java +21 −1 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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) { Loading
src/java/com/android/internal/telephony/imsphone/ImsPhone.java +1 −1 Original line number Diff line number Diff line Loading @@ -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); Loading
src/java/com/android/internal/telephony/imsphone/ImsPhoneCallTracker.java +136 −32 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading @@ -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 Loading Loading @@ -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; Loading Loading @@ -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); } } }; Loading Loading @@ -5011,6 +5067,11 @@ public class ImsPhoneCallTracker extends CallTracker implements ImsPullCall { } break; } case EVENT_PROVISIONING_CHANGED: { handleProvisioningChanged(); break; } } } Loading Loading @@ -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); } } }
tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -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