Merge changes from topic "enable-rtt-emer" into rvc-dev
* changes:
Set RTT capability on the emergency PhoneAccount
Allow RTT while roaming but on WFC
diff --git a/res/values/config.xml b/res/values/config.xml
index d4e4c79..423236d 100644
--- a/res/values/config.xml
+++ b/res/values/config.xml
@@ -257,6 +257,16 @@
audio stream which the remote party will be able to hear. -->
<bool name="config_support_telephony_audio_device">false</bool>
+ <!-- Whether the device supports dialing emergency RTT calls when there's no SIM card installed
+ -->
+ <bool name="config_support_simless_emergency_rtt">false</bool>
+
+ <!-- Array of countries that support sim-less emergency RTT calls. Values should be
+ ISO3166 country codes in lowercase. -->
+ <string-array name="config_simless_emergency_rtt_supported_countries">
+ <item>us</item>
+ </string-array>
+
<string-array translatable="false" name="config_volte_provision_error_on_publish_response">
<item>403 not authorized for presence</item>
</string-array>
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index e31de64..37212cf 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -25,6 +25,7 @@
import android.preference.PreferenceScreen;
import android.preference.SwitchPreference;
import android.provider.Settings;
+import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
import android.telephony.PhoneStateListener;
import android.telephony.SubscriptionManager;
@@ -39,6 +40,11 @@
import com.android.phone.PhoneGlobals;
import com.android.phone.R;
+import java.util.concurrent.Executor;
+import java.util.concurrent.Executors;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.TimeUnit;
+
public class AccessibilitySettingsFragment extends PreferenceFragment {
private static final String LOG_TAG = AccessibilitySettingsFragment.class.getSimpleName();
private static final boolean DBG = (PhoneGlobals.DBG_LEVEL >= 2);
@@ -48,6 +54,8 @@
private static final String BUTTON_RTT_KEY = "button_rtt_key";
private static final String RTT_INFO_PREF = "button_rtt_more_information_key";
+ private static final int WFC_QUERY_TIMEOUT_MILLIS = 20;
+
private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
/**
* Disable the TTY setting when in/out of a call (and if carrier doesn't
@@ -110,10 +118,13 @@
}
if (shouldShowRttSetting()) {
- // TODO: this is going to be a on/off switch for now. Ask UX about how to integrate
- // this settings with TTY
- if (TelephonyManager.getDefault().isNetworkRoaming(
- SubscriptionManager.getDefaultVoiceSubscriptionId())) {
+ TelephonyManager tm =
+ (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
+ boolean isRoaming = tm.isNetworkRoaming(
+ SubscriptionManager.getDefaultVoiceSubscriptionId());
+
+ boolean shouldDisableBecauseRoamingOffWfc = isRoaming && !isOnWfc();
+ if (shouldDisableBecauseRoamingOffWfc) {
mButtonRtt.setSummary(TextUtils.concat(getText(R.string.rtt_mode_summary), "\n",
getText(R.string.no_rtt_when_roaming)));
}
@@ -230,6 +241,21 @@
return false;
}
+ private boolean isOnWfc() {
+ LinkedBlockingQueue<Integer> result = new LinkedBlockingQueue<>(1);
+ Executor executor = Executors.newSingleThreadExecutor();
+ mContext.getSystemService(android.telephony.ims.ImsManager.class)
+ .getImsMmTelManager(SubscriptionManager.getDefaultSubscriptionId())
+ .getRegistrationTransportType(executor, result::offer);
+ try {
+ Integer transportType = result.poll(WFC_QUERY_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
+ return transportType != null
+ && transportType == AccessNetworkConstants.TRANSPORT_TYPE_WLAN;
+ } catch (InterruptedException e) {
+ return false;
+ }
+ }
+
private boolean shouldShowRttSetting() {
// Go through all the subs -- if we want to display the RTT setting for any of them, do
// display it.
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 2975d06..b4b7405 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -55,6 +55,7 @@
import android.text.TextUtils;
import com.android.ims.ImsManager;
+import com.android.internal.telephony.LocaleTracker;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
import com.android.internal.telephony.SubscriptionController;
@@ -67,6 +68,7 @@
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
+import java.util.function.Predicate;
/**
* Owns all data we have registered with Telecom including handling dynamic addition and
@@ -773,14 +775,51 @@
* device.
*/
private boolean isRttCurrentlySupported() {
+ // First check the emergency case -- if it's supported and turned on,
+ // we want to present RTT as available on the emergency-only phone account
+ if (mIsEmergency) {
+ // First check whether the device supports it
+ boolean devicesSupportsRtt =
+ mContext.getResources().getBoolean(R.bool.config_support_rtt);
+ boolean deviceSupportsEmergencyRtt = mContext.getResources().getBoolean(
+ R.bool.config_support_simless_emergency_rtt);
+ if (!(deviceSupportsEmergencyRtt && devicesSupportsRtt)) {
+ Log.i(this, "isRttCurrentlySupported -- emergency acct and no device support");
+ return false;
+ }
+ // Next check whether we're in or near a country that supports it
+ String country =
+ mPhone.getServiceStateTracker().getLocaleTracker()
+ .getCurrentCountry().toLowerCase();
+ String[] supportedCountries = mContext.getResources().getStringArray(
+ R.array.config_simless_emergency_rtt_supported_countries);
+ if (supportedCountries == null || Arrays.stream(supportedCountries).noneMatch(
+ Predicate.isEqual(country))) {
+ Log.i(this, "isRttCurrentlySupported -- emergency acct and"
+ + " not supported in this country: " + country);
+ return false;
+ }
+
+ return true;
+ }
+
boolean hasVoiceAvailability = isImsVoiceAvailable();
boolean isRttSupported = PhoneGlobals.getInstance().phoneMgr
.isRttEnabled(mPhone.getSubId());
boolean isRoaming = mTelephonyManager.isNetworkRoaming(mPhone.getSubId());
+ boolean isOnWfc = mPhone.getImsRegistrationTech()
+ == ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN;
- return hasVoiceAvailability && isRttSupported && !isRoaming;
+ boolean shouldDisableBecauseRoamingOffWfc = isRoaming && !isOnWfc;
+ Log.i(this, "isRttCurrentlySupported -- regular acct,"
+ + " hasVoiceAvailability: " + hasVoiceAvailability + "\n"
+ + " isRttSupported: " + isRttSupported + "\n"
+ + " isRoaming: " + isRoaming + "\n"
+ + " isOnWfc: " + isOnWfc + "\n");
+
+ return hasVoiceAvailability && isRttSupported && !shouldDisableBecauseRoamingOffWfc;
}
/**
@@ -1195,8 +1234,9 @@
//We also need to listen for locale changes
//(e.g. system language changed -> SIM card name changed)
- mContext.registerReceiver(mLocaleChangeReceiver,
- new IntentFilter(Intent.ACTION_LOCALE_CHANGED));
+ IntentFilter localeChangeFilter = new IntentFilter(Intent.ACTION_LOCALE_CHANGED);
+ localeChangeFilter.addAction(TelephonyManager.ACTION_NETWORK_COUNTRY_CHANGED);
+ mContext.registerReceiver(mLocaleChangeReceiver, localeChangeFilter);
// Listen to the RTT system setting so that we update it when the user flips it.
ContentObserver rttUiSettingObserver = new ContentObserver(