DO NOT MERGE Refactor EmergencyCallHelper -> RadioOnCallHelper am: 5e0ffbe1ac
am: a70eb99011
Change-Id: Iacda3b93579fe84bb6d95761ec16ee00677a2b4d
diff --git a/src/com/android/phone/CallFeaturesSetting.java b/src/com/android/phone/CallFeaturesSetting.java
index 111e263..a6d54ef 100644
--- a/src/com/android/phone/CallFeaturesSetting.java
+++ b/src/com/android/phone/CallFeaturesSetting.java
@@ -284,7 +284,9 @@
if (ImsManager.isVtEnabledByPlatform(mPhone.getContext()) &&
ImsManager.isVtProvisionedOnDevice(mPhone.getContext()) &&
- mPhone.mDcTracker.isDataEnabled(true)) {
+ (carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_IGNORE_DATA_ENABLED_CHANGED_FOR_VIDEO_CALLS)
+ || mPhone.mDcTracker.isDataEnabled(true))) {
boolean currentValue =
ImsManager.isEnhanced4gLteModeSettingEnabledByUser(mPhone.getContext())
? PhoneGlobals.getInstance().phoneMgr.isVideoCallingEnabled(
@@ -328,7 +330,8 @@
} else {
int resId = com.android.internal.R.string.wifi_calling_off_summary;
if (ImsManager.isWfcEnabledByUser(mPhone.getContext())) {
- int wfcMode = ImsManager.getWfcMode(mPhone.getContext());
+ boolean isRoaming = telephonyManager.isNetworkRoaming();
+ int wfcMode = ImsManager.getWfcMode(mPhone.getContext(), isRoaming);
switch (wfcMode) {
case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
resId = com.android.internal.R.string.wfc_mode_wifi_only_summary;
diff --git a/src/com/android/phone/NetworkSetting.java b/src/com/android/phone/NetworkSetting.java
index a09c5c5..29608da 100644
--- a/src/com/android/phone/NetworkSetting.java
+++ b/src/com/android/phone/NetworkSetting.java
@@ -161,8 +161,6 @@
public void onServiceConnected(ComponentName className, IBinder service) {
if (DBG) log("connection created, binding local service.");
mNetworkQueryService = ((NetworkQueryService.LocalBinder) service).getService();
- // as soon as it is bound, run a query.
- loadNetworksList();
}
/** Handle the task of cleaning up the local binding */
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index ea19f75..0c186a9 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -24,7 +24,6 @@
import android.preference.PreferenceFragment;
import android.preference.PreferenceScreen;
import android.provider.Settings;
-import android.telecom.TelecomManager;
import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
@@ -35,9 +34,6 @@
import com.android.internal.telephony.PhoneFactory;
import com.android.phone.PhoneGlobals;
import com.android.phone.R;
-import com.android.phone.settings.TtyModeListPreference;
-
-import java.util.List;
public class AccessibilitySettingsFragment extends PreferenceFragment {
private static final String LOG_TAG = AccessibilitySettingsFragment.class.getSimpleName();
@@ -60,7 +56,7 @@
if (pref != null) {
final boolean isVolteTtySupported = ImsManager.isVolteEnabledByPlatform(mContext)
&& getVolteTtySupported();
- pref.setEnabled((isVolteTtySupported && !isVideoCallInProgress()) ||
+ pref.setEnabled((isVolteTtySupported && !isVideoCallOrConferenceInProgress()) ||
(state == TelephonyManager.CALL_STATE_IDLE));
}
}
@@ -144,15 +140,15 @@
CarrierConfigManager.KEY_CARRIER_VOLTE_TTY_SUPPORTED_BOOL);
}
- private boolean isVideoCallInProgress() {
+ private boolean isVideoCallOrConferenceInProgress() {
final Phone[] phones = PhoneFactory.getPhones();
if (phones == null) {
- if (DBG) Log.d(LOG_TAG, "isVideoCallInProgress: No phones found. Return false");
+ if (DBG) Log.d(LOG_TAG, "isVideoCallOrConferenceInProgress: No phones found.");
return false;
}
for (Phone phone : phones) {
- if (phone.isVideoCallPresent()) {
+ if (phone.isImsVideoCallOrConferencePresent()) {
return true;
}
}
diff --git a/src/com/android/phone/vvm/omtp/ActivationTask.java b/src/com/android/phone/vvm/omtp/ActivationTask.java
index 72f1f54..6fd42fd 100644
--- a/src/com/android/phone/vvm/omtp/ActivationTask.java
+++ b/src/com/android/phone/vvm/omtp/ActivationTask.java
@@ -27,7 +27,6 @@
import android.telecom.PhoneAccountHandle;
import android.telephony.ServiceState;
import android.telephony.TelephonyManager;
-
import com.android.phone.Assert;
import com.android.phone.PhoneGlobals;
import com.android.phone.VoicemailStatus;
@@ -40,7 +39,6 @@
import com.android.phone.vvm.omtp.sync.OmtpVvmSyncService;
import com.android.phone.vvm.omtp.sync.SyncTask;
import com.android.phone.vvm.omtp.utils.PhoneAccountHandleConverter;
-
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
@@ -135,7 +133,7 @@
OmtpVvmCarrierConfigHelper helper = new OmtpVvmCarrierConfigHelper(getContext(), subId);
if (!helper.isValid()) {
VvmLog.i(TAG, "VVM not supported on subId " + subId);
- VoicemailStatus.disable(getContext(), phoneAccountHandle);
+ OmtpVvmSourceManager.getInstance(getContext()).removeSource(phoneAccountHandle);
return;
}
diff --git a/src/com/android/phone/vvm/omtp/SimChangeReceiver.java b/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
index 25c27db..a506a12 100644
--- a/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
+++ b/src/com/android/phone/vvm/omtp/SimChangeReceiver.java
@@ -24,12 +24,13 @@
import android.os.UserManager;
import android.telecom.PhoneAccountHandle;
import android.telephony.CarrierConfigManager;
+import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
+import android.text.TextUtils;
import com.android.internal.telephony.IccCardConstants;
import com.android.internal.telephony.PhoneConstants;
import com.android.internal.telephony.TelephonyIntents;
-import com.android.phone.VoicemailStatus;
import com.android.phone.settings.VisualVoicemailSettingsUtil;
import com.android.phone.vvm.omtp.sync.OmtpVvmSourceManager;
import com.android.phone.vvm.omtp.utils.PhoneAccountHandleConverter;
@@ -70,6 +71,25 @@
VvmLog.i(TAG, "Received SIM change for invalid subscription id.");
return;
}
+
+ TelephonyManager telephonyManager = context
+ .getSystemService(TelephonyManager.class);
+ if(TextUtils.isEmpty(telephonyManager.getSimOperator())){
+ VvmLog.e(TAG,
+ "Empty MCCMNC, possible modem crash."
+ + " Ignoring carrier config changed event");
+ return;
+ }
+
+ PhoneAccountHandle phoneAccountHandle = PhoneAccountHandleConverter
+ .fromSubId(subId);
+ if("null".equals(phoneAccountHandle.getId())){
+ VvmLog.e(TAG,
+ "null phone account handle ID, possible modem crash."
+ + " Ignoring carrier config changed event");
+ return;
+ }
+
VvmLog.d(TAG, "Carrier config changed");
if (UserManager.get(context).isUserUnlocked() && !isCryptKeeperMode()) {
processSubId(context, subId);
@@ -99,6 +119,12 @@
// can be recorded.
OmtpVvmSourceManager.getInstance(context).addPhoneStateListener(
phoneAccount);
+ if (context.getSystemService(TelephonyManager.class)
+ .getServiceStateForSubscriber(subId).getState()
+ != ServiceState.STATE_IN_SERVICE) {
+ VvmLog.i(TAG, "Cellular signal not available, not activating");
+ return;
+ }
carrierConfigHelper.startActivation();
} else {
if (carrierConfigHelper.isLegacyModeEnabled()) {
@@ -115,7 +141,7 @@
String mccMnc = context.getSystemService(TelephonyManager.class).getSimOperator(subId);
VvmLog.d(TAG,
"visual voicemail not supported for carrier " + mccMnc + " on subId " + subId);
- VoicemailStatus.disable(context, phoneAccount);
+ OmtpVvmSourceManager.getInstance(context).removeSource(phoneAccount);
}
}
diff --git a/src/com/android/phone/vvm/omtp/protocol/OmtpProtocol.java b/src/com/android/phone/vvm/omtp/protocol/OmtpProtocol.java
index d002652..7ec3dba 100644
--- a/src/com/android/phone/vvm/omtp/protocol/OmtpProtocol.java
+++ b/src/com/android/phone/vvm/omtp/protocol/OmtpProtocol.java
@@ -28,6 +28,7 @@
public OmtpMessageSender createMessageSender(SmsManager smsManager, short applicationPort,
String destinationNumber) {
return new OmtpStandardMessageSender(smsManager, applicationPort, destinationNumber,
- null, OmtpConstants.PROTOCOL_VERSION1_1, null);
+ OmtpConstants.CLIENT_TYPE_GOOGLE_10, OmtpConstants.PROTOCOL_VERSION1_1,
+ null /*clientPrefix*/);
}
}
diff --git a/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java b/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java
index d95879f..524c96d 100644
--- a/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java
+++ b/src/com/android/phone/vvm/omtp/protocol/Vvm3EventHandler.java
@@ -18,13 +18,17 @@
import android.annotation.IntDef;
import android.content.Context;
+import android.provider.VoicemailContract.Status;
+import android.telecom.PhoneAccountHandle;
import android.util.Log;
+
import com.android.phone.VoicemailStatus;
import com.android.phone.settings.VoicemailChangePinActivity;
import com.android.phone.vvm.omtp.DefaultOmtpEventHandler;
import com.android.phone.vvm.omtp.OmtpEvents;
import com.android.phone.vvm.omtp.OmtpEvents.Type;
import com.android.phone.vvm.omtp.OmtpVvmCarrierConfigHelper;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -113,19 +117,22 @@
OmtpEvents event) {
switch (event) {
case CONFIG_REQUEST_STATUS_SUCCESS:
- if (status.getPhoneAccountHandle() == null) {
- // This should never happen.
- Log.e(TAG, "status editor has null phone account handle");
- return true;
- }
-
- if (!VoicemailChangePinActivity
- .isDefaultOldPinSet(context, status.getPhoneAccountHandle())) {
+ if (!isPinRandomized(context, status.getPhoneAccountHandle())) {
return false;
} else {
postError(status, PIN_NOT_SET);
}
break;
+ case CONFIG_ACTIVATING_SUBSEQUENT:
+ if (isPinRandomized(context, status.getPhoneAccountHandle())) {
+ status.setConfigurationState(PIN_NOT_SET);
+ } else {
+ status.setConfigurationState(Status.CONFIGURATION_STATE_OK);
+ }
+ status
+ .setNotificationChannelState(Status.NOTIFICATION_CHANNEL_STATE_OK)
+ .setDataChannelState(Status.DATA_CHANNEL_STATE_OK).apply();
+ break;
case CONFIG_DEFAULT_PIN_REPLACED:
postError(status, PIN_NOT_SET);
break;
@@ -269,4 +276,13 @@
}
editor.apply();
}
+
+ private static boolean isPinRandomized(Context context, PhoneAccountHandle phoneAccountHandle) {
+ if (phoneAccountHandle == null) {
+ // This should never happen.
+ Log.e(TAG, "status editor has null phone account handle");
+ return false;
+ }
+ return VoicemailChangePinActivity.isDefaultOldPinSet(context, phoneAccountHandle);
+ }
}
diff --git a/src/com/android/phone/vvm/omtp/sms/OmtpCvvmMessageSender.java b/src/com/android/phone/vvm/omtp/sms/OmtpCvvmMessageSender.java
index 7f45254..98d8594 100644
--- a/src/com/android/phone/vvm/omtp/sms/OmtpCvvmMessageSender.java
+++ b/src/com/android/phone/vvm/omtp/sms/OmtpCvvmMessageSender.java
@@ -48,7 +48,7 @@
private void sendCvvmMessage(String request, PendingIntent sentIntent) {
StringBuilder sb = new StringBuilder().append(request);
sb.append(OmtpConstants.SMS_PREFIX_SEPARATOR);
- appendField(sb, "dt", "15");
+ appendField(sb, "dt" /* device type */, "6" /* no VTT (transcription) support*/);
sendSms(sb.toString(), sentIntent);
}
}
diff --git a/src/com/android/services/telephony/CdmaConferenceController.java b/src/com/android/services/telephony/CdmaConferenceController.java
index 0a7c18b..846df61 100644
--- a/src/com/android/services/telephony/CdmaConferenceController.java
+++ b/src/com/android/services/telephony/CdmaConferenceController.java
@@ -122,8 +122,18 @@
}
}, ADD_OUTGOING_CONNECTION_DELAY_MILLIS);
} else {
- // This is the first connection, or it is incoming, so let it flow through.
- addInternal(connection);
+ // Post the call to addInternal to the handler with no delay.
+ // Why you ask? In TelephonyConnectionService#
+ // onCreateIncomingConnection(PhoneAccountHandle, ConnectionRequest) or
+ // TelephonyConnectionService#onCreateOutgoingConnection(PhoneAccountHandle,
+ // ConnectionRequest) we can create a new connection it will trigger a call to
+ // TelephonyConnectionService#addConnectionToConferenceController, which will cause us
+ // to get here. HOWEVER, at this point ConnectionService#addConnection has not yet run,
+ // so if we end up calling ConnectionService#addConference, the connection service will
+ // not yet know about the new connection, so it won't get added to the conference.
+ // Posting to the handler ensures addConnection has a chance to happen before we add the
+ // conference.
+ mHandler.post(() -> addInternal(connection));
}
}
diff --git a/src/com/android/services/telephony/DisconnectCauseUtil.java b/src/com/android/services/telephony/DisconnectCauseUtil.java
index c356899..fcc37f4 100644
--- a/src/com/android/services/telephony/DisconnectCauseUtil.java
+++ b/src/com/android/services/telephony/DisconnectCauseUtil.java
@@ -27,11 +27,10 @@
public class DisconnectCauseUtil {
/**
- * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more generic
- * {@link android.telecom.DisconnectCause}.object, possibly populated with a localized message
- * and tone.
+ * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
+ * generic {@link android.telecom.DisconnectCause} object, possibly populated with a localized
+ * message and tone.
*
- * @param context The context.
* @param telephonyDisconnectCause The code for the reason for the disconnect.
*/
public static DisconnectCause toTelecomDisconnectCause(int telephonyDisconnectCause) {
@@ -39,11 +38,10 @@
}
/**
- * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more generic
- * {@link android.telecom.DisconnectCause}.object, possibly populated with a localized message
- * and tone.
+ * Converts from a disconnect code in {@link android.telephony.DisconnectCause} into a more
+ * generic {@link android.telecom.DisconnectCause}.object, possibly populated with a localized
+ * message and tone.
*
- * @param context The context.
* @param telephonyDisconnectCause The code for the reason for the disconnect.
* @param reason Description of the reason for the disconnect, not intended for the user to see..
*/
@@ -54,7 +52,7 @@
toTelecomDisconnectCauseCode(telephonyDisconnectCause),
toTelecomDisconnectCauseLabel(context, telephonyDisconnectCause),
toTelecomDisconnectCauseDescription(context, telephonyDisconnectCause),
- toTelecomDisconnectReason(telephonyDisconnectCause, reason),
+ toTelecomDisconnectReason(context,telephonyDisconnectCause, reason),
toTelecomDisconnectCauseTone(telephonyDisconnectCause));
}
@@ -129,6 +127,7 @@
case android.telephony.DisconnectCause.DATA_DISABLED:
case android.telephony.DisconnectCause.DATA_LIMIT_REACHED:
case android.telephony.DisconnectCause.DIALED_ON_WRONG_SLOT:
+ case android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING:
case android.telephony.DisconnectCause.IMEI_NOT_ACCEPTED:
case android.telephony.DisconnectCause.WIFI_LOST:
return DisconnectCause.ERROR;
@@ -382,6 +381,9 @@
case android.telephony.DisconnectCause.DATA_LIMIT_REACHED:
resourceId = R.string.callFailed_data_limit_reached_description;
break;
+ case android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING:
+ resourceId = com.android.internal.R.string.mmiErrorWhileRoaming;
+ break;
case android.telephony.DisconnectCause.IMEI_NOT_ACCEPTED:
resourceId = R.string.callFailed_imei_not_accepted;
@@ -397,7 +399,36 @@
return resourceId == null ? "" : context.getResources().getString(resourceId);
}
- private static String toTelecomDisconnectReason(int telephonyDisconnectCause, String reason) {
+ /**
+ * Maps the telephony {@link android.telephony.DisconnectCause} into a reason string which is
+ * returned in the Telecom {@link DisconnectCause#getReason()}.
+ *
+ * @param context The current context.
+ * @param telephonyDisconnectCause The {@link android.telephony.DisconnectCause} code.
+ * @param reason A reason provided by the caller; only used if a more specific reason cannot
+ * be determined here.
+ * @return The disconnect reason.
+ */
+ private static String toTelecomDisconnectReason(Context context, int telephonyDisconnectCause,
+ String reason) {
+
+ if (context == null) {
+ return "";
+ }
+
+ switch (telephonyDisconnectCause) {
+ case android.telephony.DisconnectCause.POWER_OFF:
+ // Airplane mode (radio off)
+ // intentional fall-through
+ case android.telephony.DisconnectCause.OUT_OF_SERVICE:
+ // No network connection.
+ if (ImsUtil.shouldPromoteWfc(context)) {
+ return android.telecom.DisconnectCause.REASON_WIFI_ON_BUT_WFC_OFF;
+ }
+ break;
+ }
+
+ // If no specific code-mapping found, then fall back to using the reason.
String causeAsString = android.telephony.DisconnectCause.toString(telephonyDisconnectCause);
if (reason == null) {
return causeAsString;
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index e165fa2..722183a 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -480,6 +480,15 @@
return failedConnection;
}
+ // Check roaming status to see if we should block custom call forwarding codes
+ if (blockCallForwardingNumberWhileRoaming(phone, number)) {
+ return Connection.createFailedConnection(
+ DisconnectCauseUtil.toTelecomDisconnectCause(
+ android.telephony.DisconnectCause.DIALED_CALL_FORWARDING_WHILE_ROAMING,
+ "Call forwarding while roaming"));
+ }
+
+
final TelephonyConnection connection =
createConnectionFor(phone, null, true /* isOutgoing */, request.getAccountHandle(),
request.getTelecomCallId(), request.getAddress(), request.getVideoState());
@@ -691,6 +700,28 @@
}
}
+ private boolean blockCallForwardingNumberWhileRoaming(Phone phone, String number) {
+ if (phone == null || TextUtils.isEmpty(number) || !phone.getServiceState().getRoaming()) {
+ return false;
+ }
+ String[] blockPrefixes = null;
+ CarrierConfigManager cfgManager = (CarrierConfigManager)
+ phone.getContext().getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ if (cfgManager != null) {
+ blockPrefixes = cfgManager.getConfigForSubId(phone.getSubId()).getStringArray(
+ CarrierConfigManager.KEY_CALL_FORWARDING_BLOCKS_WHILE_ROAMING_STRING_ARRAY);
+ }
+
+ if (blockPrefixes != null) {
+ for (String prefix : blockPrefixes) {
+ if (number.startsWith(prefix)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
private boolean isRadioOn() {
boolean result = false;
for (Phone phone : PhoneFactory.getPhones()) {