Merge "Fix issues associated with hold failure"
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index dbb9671..0028e63 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -87,11 +87,11 @@
<protected-broadcast android:name= "android.telephony.action.SIM_APPLICATION_STATE_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.SIM_SLOT_STATUS_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.SUBSCRIPTION_CARRIER_IDENTITY_CHANGED" />
- <protected-broadcast android:name= "android.telephony.action.SUBSCRIPTION_PRECISE_CARRIER_IDENTITY_CHANGED" />
+ <protected-broadcast android:name= "android.telephony.action.SUBSCRIPTION_SPECIFIC_CARRIER_IDENTITY_CHANGED" />
<protected-broadcast android:name= "android.telephony.action.NETWORK_COUNTRY_CHANGED" />
<!-- For Vendor Debugging in Telephony -->
- <protected-broadcast android:name="android.telephony.action.DEBUG_EVENT" />
+ <protected-broadcast android:name="android.telephony.action.ANOMALY_REPORTED" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.CALL_PHONE" />
@@ -552,6 +552,7 @@
<activity android:name="com.android.phone.settings.VoicemailSettingsActivity"
android:label="@string/voicemail"
android:configChanges="orientation|screenSize|keyboardHidden|screenLayout"
+ android:screenOrientation="portrait"
android:theme="@style/DialerSettingsLight">
<intent-filter >
<!-- DO NOT RENAME. There are existing apps which use this string. -->
diff --git a/src/com/android/phone/CallNotifier.java b/src/com/android/phone/CallNotifier.java
index bd97b69..3796e64 100644
--- a/src/com/android/phone/CallNotifier.java
+++ b/src/com/android/phone/CallNotifier.java
@@ -552,7 +552,8 @@
}
public void updatePhoneStateListeners(boolean isRefresh, int updateType, int subIdToUpdate) {
- List<SubscriptionInfo> subInfos = mSubscriptionManager.getActiveSubscriptionInfoList();
+ List<SubscriptionInfo> subInfos = SubscriptionController.getInstance()
+ .getActiveSubscriptionInfoList(mApplication.getOpPackageName());
// Sort sub id list based on slot id, so that CFI/MWI notifications will be updated for
// slot 0 first then slot 1. This is needed to ensure that when CFI or MWI is enabled for
diff --git a/src/com/android/phone/CarrierConfigLoader.java b/src/com/android/phone/CarrierConfigLoader.java
index 1e9e286..137d3d1 100644
--- a/src/com/android/phone/CarrierConfigLoader.java
+++ b/src/com/android/phone/CarrierConfigLoader.java
@@ -532,8 +532,8 @@
if (addSubIdExtra && (simApplicationState != TelephonyManager.SIM_STATE_UNKNOWN
&& simApplicationState != TelephonyManager.SIM_STATE_NOT_READY)) {
SubscriptionManager.putPhoneIdAndSubIdExtra(intent, phoneId);
- intent.putExtra(TelephonyManager.EXTRA_PRECISE_CARRIER_ID,
- getPreciseCarrierIdForPhoneId(phoneId));
+ intent.putExtra(TelephonyManager.EXTRA_SPECIFIC_CARRIER_ID,
+ getSpecificCarrierIdForPhoneId(phoneId));
intent.putExtra(TelephonyManager.EXTRA_CARRIER_ID, getCarrierIdForPhoneId(phoneId));
}
intent.putExtra(CarrierConfigManager.EXTRA_SLOT_INDEX, phoneId);
@@ -564,7 +564,7 @@
String spn = TelephonyManager.from(mContext).getSimOperatorNameForPhone(phoneId);
String simOperator = TelephonyManager.from(mContext).getSimOperatorNumericForPhone(phoneId);
int carrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
- int preciseCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
+ int specificCarrierId = TelephonyManager.UNKNOWN_CARRIER_ID;
// A valid simOperator should be 5 or 6 digits, depending on the length of the MNC.
if (simOperator != null && simOperator.length() >= 3) {
mcc = simOperator.substring(0, 3);
@@ -576,9 +576,9 @@
gid1 = phone.getGroupIdLevel1();
gid2 = phone.getGroupIdLevel2();
carrierId = phone.getCarrierId();
- preciseCarrierId = phone.getPreciseCarrierId();
+ specificCarrierId = phone.getSpecificCarrierId();
}
- return new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2, carrierId, preciseCarrierId);
+ return new CarrierIdentifier(mcc, mnc, spn, imsi, gid1, gid2, carrierId, specificCarrierId);
}
/** Returns the package name of a priveleged carrier app, or null if there is none. */
@@ -605,9 +605,9 @@
}
/**
- * Get the sim precise carrier id {@link TelephonyManager#getSimPreciseCarrierId()}
+ * Get the sim specific carrier id {@link TelephonyManager#getSimSpecificCarrierId()}
*/
- private int getPreciseCarrierIdForPhoneId(int phoneId) {
+ private int getSpecificCarrierIdForPhoneId(int phoneId) {
if (!SubscriptionManager.isValidPhoneId(phoneId)) {
return TelephonyManager.UNKNOWN_CARRIER_ID;
}
@@ -615,7 +615,7 @@
if (phone == null) {
return TelephonyManager.UNKNOWN_CARRIER_ID;
}
- return phone.getPreciseCarrierId();
+ return phone.getSpecificCarrierId();
}
/**
@@ -636,7 +636,7 @@
* Writes a bundle to an XML file.
*
* The bundle will be written to a file named after the package name, ICCID and
- * precise carrier id {@link TelephonyManager#getSimPreciseCarrierId()}. the same carrier
+ * specific carrier id {@link TelephonyManager#getSimSpecificCarrierId()}. the same carrier
* should have a single copy of XML file named after carrier id. However, it's still possible
* that platform doesn't recognize the current sim carrier, we will use iccid + carrierid as
* the canonical file name. carrierid can also handle the cases SIM OTA resolves to different
@@ -659,7 +659,7 @@
}
final String iccid = getIccIdForPhoneId(phoneId);
- final int cid = getPreciseCarrierIdForPhoneId(phoneId);
+ final int cid = getSpecificCarrierIdForPhoneId(phoneId);
if (packageName == null || iccid == null) {
loge("Cannot save config with null packageName or iccid.");
return;
@@ -734,7 +734,7 @@
}
final String iccid = getIccIdForPhoneId(phoneId);
- final int cid = getPreciseCarrierIdForPhoneId(phoneId);
+ final int cid = getSpecificCarrierIdForPhoneId(phoneId);
if (packageName == null || iccid == null) {
loge("Cannot restore config with null packageName or iccid.");
return null;
diff --git a/src/com/android/phone/EmergencyDialer.java b/src/com/android/phone/EmergencyDialer.java
index 9e40ffe..cff27b1 100644
--- a/src/com/android/phone/EmergencyDialer.java
+++ b/src/com/android/phone/EmergencyDialer.java
@@ -129,7 +129,7 @@
private MetricsLogger mMetricsLogger = new MetricsLogger();
public void writeMetricsForEnter() {
- if (!mIsShortcutViewEnabled) {
+ if (!mShortcutViewConfig.isEnabled()) {
return;
}
@@ -142,7 +142,7 @@
}
public void writeMetricsForExit() {
- if (!mIsShortcutViewEnabled) {
+ if (!mShortcutViewConfig.isEnabled()) {
return;
}
@@ -157,7 +157,7 @@
public void writeMetricsForMakingCall(int callSource, int phoneNumberType,
boolean hasShortcut) {
- if (!mIsShortcutViewEnabled) {
+ if (!mShortcutViewConfig.isEnabled()) {
return;
}
@@ -230,8 +230,6 @@
private View mEmergencyShortcutView;
private View mDialpadView;
- private ShortcutViewUtils.PhoneInfo mPhoneInfo;
-
private List<EmergencyShortcutButton> mEmergencyShortcutButtonList;
private EccShortcutAdapter mShortcutAdapter;
private DataSetObserver mShortcutDataSetObserver = null;
@@ -291,7 +289,7 @@
private float mDefaultDigitsTextSize;
private int mEntryType;
- private boolean mIsShortcutViewEnabled;
+ private ShortcutViewUtils.Config mShortcutViewConfig;
private MetricsWriter mMetricsWriter;
private SensorManager mSensorManager;
@@ -361,20 +359,13 @@
PersistableBundle carrierConfig =
configMgr.getConfigForSubId(SubscriptionManager.getDefaultVoiceSubscriptionId());
- mIsShortcutViewEnabled = false;
- mPhoneInfo = null;
- if (canEnableShortcutView(carrierConfig)) {
- mPhoneInfo = ShortcutViewUtils.pickPreferredPhone(this);
- if (mPhoneInfo != null) {
- mIsShortcutViewEnabled = true;
- }
- }
+ mShortcutViewConfig = new ShortcutViewUtils.Config(this, carrierConfig, mEntryType);
Log.d(LOG_TAG, "Enable emergency dialer shortcut: "
- + mIsShortcutViewEnabled);
+ + mShortcutViewConfig.isEnabled());
mColorExtractor = new ColorExtractor(this);
- if (mIsShortcutViewEnabled) {
+ if (mShortcutViewConfig.isEnabled()) {
// Shortcut view doesn't support dark text theme.
updateTheme(false);
} else {
@@ -399,7 +390,7 @@
((WindowManager) getSystemService(Context.WINDOW_SERVICE))
.getDefaultDisplay().getSize(displaySize);
mBackgroundGradient.setScreenSize(displaySize.x, displaySize.y);
- mBackgroundGradient.setAlpha(mIsShortcutViewEnabled
+ mBackgroundGradient.setAlpha(mShortcutViewConfig.isEnabled()
? BLACK_BACKGROUND_GRADIENT_ALPHA : BACKGROUND_GRADIENT_ALPHA);
getWindow().setBackgroundDrawable(mBackgroundGradient);
@@ -463,7 +454,7 @@
mEmergencyInfoGroup = (EmergencyInfoGroup) findViewById(R.id.emergency_info_button);
- if (mIsShortcutViewEnabled) {
+ if (mShortcutViewConfig.isEnabled()) {
setupEmergencyShortcutsView();
}
}
@@ -529,7 +520,7 @@
public void onBackPressed() {
// If shortcut view is enabled and Dialpad view is visible, pressing the back key will
// back to display EmergencyShortcutView view. Otherwise, it would finish the activity.
- if (mIsShortcutViewEnabled && mDialpadView != null
+ if (mShortcutViewConfig.isEnabled() && mDialpadView != null
&& mDialpadView.getVisibility() == View.VISIBLE) {
switchView(mEmergencyShortcutView, mDialpadView, true);
return;
@@ -606,7 +597,7 @@
if (!TextUtils.isEmpty(phoneNumber)) {
if (DBG) Log.d(LOG_TAG, "dial emergency number: " + Rlog.pii(LOG_TAG, phoneNumber));
placeCall(phoneNumber, ParcelableCallAnalytics.CALL_SOURCE_EMERGENCY_SHORTCUT,
- mPhoneInfo);
+ mShortcutViewConfig.getPhoneInfo());
} else {
Log.d(LOG_TAG, "emergency number is empty");
}
@@ -747,7 +738,7 @@
mUserActions = MetricsWriter.USER_ACTION_NONE;
mMetricsWriter.writeMetricsForEnter();
- if (mIsShortcutViewEnabled) {
+ if (mShortcutViewConfig.isEnabled()) {
// Shortcut view doesn't support dark text theme.
mBackgroundGradient.setColors(Color.BLACK, Color.BLACK, false);
updateTheme(false);
@@ -760,8 +751,7 @@
updateTheme(lockScreenColors.supportsDarkText());
}
- if (mIsShortcutViewEnabled) {
- mPhoneInfo = ShortcutViewUtils.pickPreferredPhone(this);
+ if (mShortcutViewConfig.isEnabled()) {
updateLocationAndEccInfo();
}
}
@@ -811,19 +801,6 @@
mColorExtractor.removeOnColorsChangedListener(this);
}
- private boolean canEnableShortcutView(PersistableBundle carrierConfig) {
- if (mEntryType != ENTRY_TYPE_POWER_MENU) {
- Log.d(LOG_TAG, "Disables shortcut view since it's not launched from power menu");
- return false;
- }
- if (!carrierConfig.getBoolean(
- CarrierConfigManager.KEY_SUPPORT_EMERGENCY_DIALER_SHORTCUT_BOOL)) {
- Log.d(LOG_TAG, "Disables shortcut view by carrier requirement");
- return false;
- }
- return true;
- }
-
/**
* Sets theme based on gradient colors
*
@@ -867,15 +844,12 @@
// nothing and just returns input number.
mLastNumber = PhoneNumberUtils.convertToEmergencyNumber(this, mLastNumber);
- boolean isEmergencyNumber = false;
+ boolean isEmergencyNumber;
ShortcutViewUtils.PhoneInfo phoneToMakeCall = null;
- if (mPhoneInfo != null) {
- isEmergencyNumber = mPhoneInfo.hasPromotedEmergencyNumber(mLastNumber);
- if (isEmergencyNumber) {
- phoneToMakeCall = mPhoneInfo;
- }
- }
- if (!isEmergencyNumber) {
+ if (mShortcutViewConfig.hasPromotedEmergencyNumber(mLastNumber)) {
+ isEmergencyNumber = true;
+ phoneToMakeCall = mShortcutViewConfig.getPhoneInfo();
+ } else {
TelephonyManager tm = getSystemService(TelephonyManager.class);
isEmergencyNumber = tm.isCurrentEmergencyNumber(mLastNumber);
}
@@ -1155,7 +1129,7 @@
private void setLocationInfo() {
final View locationInfo = findViewById(R.id.location_info);
- String countryIso = mPhoneInfo != null ? mPhoneInfo.getCountryIso() : null;
+ String countryIso = mShortcutViewConfig.getCountryIso();
String countryName = null;
if (!TextUtils.isEmpty(countryIso)) {
Locale locale = Locale.getDefault();
@@ -1236,7 +1210,7 @@
if (!isFinishing() && !isDestroyed()) {
setLocationInfo();
if (mShortcutAdapter != null) {
- mShortcutAdapter.updateCountryEccInfo(this, mPhoneInfo);
+ mShortcutAdapter.updateCountryEccInfo(this, mShortcutViewConfig.getPhoneInfo());
}
}
}
diff --git a/src/com/android/phone/PhoneGlobals.java b/src/com/android/phone/PhoneGlobals.java
index 3d82e74..94cd0f6 100644
--- a/src/com/android/phone/PhoneGlobals.java
+++ b/src/com/android/phone/PhoneGlobals.java
@@ -43,8 +43,8 @@
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.telecom.TelecomManager;
+import android.telephony.AnomalyReporter;
import android.telephony.CarrierConfigManager;
-import android.telephony.DebugEventReporter;
import android.telephony.ServiceState;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
@@ -284,8 +284,8 @@
// getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY_VOICE_CALLS);
if (mCM == null) {
- // Initialize DebugEventReporter early so that it can be used
- DebugEventReporter.initialize(this);
+ // Initialize AnomalyReporter early so that it can be used
+ AnomalyReporter.initialize(this);
// Inject telephony component factory if configured using other jars.
XmlResourceParser parser = getResources().getXml(R.xml.telephony_injection);
diff --git a/src/com/android/phone/PhoneInterfaceManager.java b/src/com/android/phone/PhoneInterfaceManager.java
index fd484f0..46f99e2 100755
--- a/src/com/android/phone/PhoneInterfaceManager.java
+++ b/src/com/android/phone/PhoneInterfaceManager.java
@@ -2212,23 +2212,23 @@
}
@Override
- public int getSubscriptionPreciseCarrierId(int subId) {
+ public int getSubscriptionSpecificCarrierId(int subId) {
final long identity = Binder.clearCallingIdentity();
try {
final Phone phone = getPhone(subId);
return phone == null ? TelephonyManager.UNKNOWN_CARRIER_ID
- : phone.getPreciseCarrierId();
+ : phone.getSpecificCarrierId();
} finally {
Binder.restoreCallingIdentity(identity);
}
}
@Override
- public String getSubscriptionPreciseCarrierName(int subId) {
+ public String getSubscriptionSpecificCarrierName(int subId) {
final long identity = Binder.clearCallingIdentity();
try {
final Phone phone = getPhone(subId);
- return phone == null ? null : phone.getPreciseCarrierName();
+ return phone == null ? null : phone.getSpecificCarrierName();
} finally {
Binder.restoreCallingIdentity(identity);
}
diff --git a/src/com/android/phone/ShortcutViewUtils.java b/src/com/android/phone/ShortcutViewUtils.java
index 595ea86..7e24c7a 100644
--- a/src/com/android/phone/ShortcutViewUtils.java
+++ b/src/com/android/phone/ShortcutViewUtils.java
@@ -17,9 +17,12 @@
package com.android.phone;
import android.content.Context;
+import android.os.PersistableBundle;
+import android.provider.Settings;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
+import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.emergency.EmergencyNumber;
@@ -54,6 +57,64 @@
PROMOTED_CATEGORIES_BITMASK = bitmask;
}
+ static class Config {
+ private final boolean mCanEnableShortcutView;
+ private PhoneInfo mPhoneInfo = null;
+
+ Config(@NonNull Context context, PersistableBundle carrierConfig, int entryType) {
+ mCanEnableShortcutView = canEnableShortcutView(carrierConfig, entryType);
+ refresh(context);
+ }
+
+ void refresh(@NonNull Context context) {
+ if (mCanEnableShortcutView && !isAirplaneModeOn(context)) {
+ mPhoneInfo = ShortcutViewUtils.pickPreferredPhone(context);
+ } else {
+ mPhoneInfo = null;
+ }
+ }
+
+ boolean isEnabled() {
+ return mPhoneInfo != null;
+ }
+
+ PhoneInfo getPhoneInfo() {
+ return mPhoneInfo;
+ }
+
+ String getCountryIso() {
+ if (mPhoneInfo == null) {
+ return null;
+ }
+ return mPhoneInfo.getCountryIso();
+ }
+
+ boolean hasPromotedEmergencyNumber(String number) {
+ if (mPhoneInfo == null) {
+ return false;
+ }
+ return mPhoneInfo.hasPromotedEmergencyNumber(number);
+ }
+
+ private boolean canEnableShortcutView(PersistableBundle carrierConfig, int entryType) {
+ if (entryType != EmergencyDialer.ENTRY_TYPE_POWER_MENU) {
+ Log.d(LOG_TAG, "Disables shortcut view since it's not launched from power menu");
+ return false;
+ }
+ if (carrierConfig == null || !carrierConfig.getBoolean(
+ CarrierConfigManager.KEY_SUPPORT_EMERGENCY_DIALER_SHORTCUT_BOOL)) {
+ Log.d(LOG_TAG, "Disables shortcut view by carrier requirement");
+ return false;
+ }
+ return true;
+ }
+
+ private boolean isAirplaneModeOn(@NonNull Context context) {
+ return Settings.Global.getInt(context.getContentResolver(),
+ Settings.Global.AIRPLANE_MODE_ON, 0) != 0;
+ }
+ }
+
// Info and emergency call capability of every phone.
static class PhoneInfo {
private final PhoneAccountHandle mHandle;
diff --git a/src/com/android/phone/settings/AccessibilitySettingsFragment.java b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
index 5c614d9..d540fba 100644
--- a/src/com/android/phone/settings/AccessibilitySettingsFragment.java
+++ b/src/com/android/phone/settings/AccessibilitySettingsFragment.java
@@ -93,7 +93,7 @@
mButtonHac = (SwitchPreference) findPreference(BUTTON_HAC_KEY);
mButtonRtt = (SwitchPreference) findPreference(BUTTON_RTT_KEY);
- if (PhoneGlobals.getInstance().phoneMgr.isTtyModeSupported()) {
+ if (PhoneGlobals.getInstance().phoneMgr.isTtyModeSupported() && isTtySupportedByCarrier()) {
mButtonTty.init();
} else {
getPreferenceScreen().removePreference(mButtonTty);
@@ -191,4 +191,15 @@
}
return false;
}
+
+ /**
+ * Determines if the device supports TTY per carrier config.
+ * @return {@code true} if the carrier supports TTY, {@code false} otherwise.
+ */
+ private boolean isTtySupportedByCarrier() {
+ CarrierConfigManager configManager =
+ (CarrierConfigManager) mContext.getSystemService(Context.CARRIER_CONFIG_SERVICE);
+ return configManager.getConfig().getBoolean(
+ CarrierConfigManager.KEY_TTY_SUPPORTED_BOOL);
+ }
}
diff --git a/src/com/android/services/telephony/TelecomAccountRegistry.java b/src/com/android/services/telephony/TelecomAccountRegistry.java
index 6026443..fce4dfe 100644
--- a/src/com/android/services/telephony/TelecomAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecomAccountRegistry.java
@@ -1031,10 +1031,16 @@
Log.d(this, "Phone with subscription id %d", subscriptionId);
// setupAccounts can be called multiple times during service changes. Don't add an
// account if the Icc has not been set yet.
- if (subscriptionId >= 0 && phone.getFullIccSerialNumber() != null) {
- mAccounts.add(new AccountEntry(phone, false /* emergency */,
- false /* isDummy */));
- }
+ if (!SubscriptionManager.isValidSubscriptionId(subscriptionId)
+ || phone.getFullIccSerialNumber() == null) return;
+ // Don't add account if it's opportunistic subscription, which is considered
+ // data only for now.
+ SubscriptionInfo info = SubscriptionManager.from(mContext)
+ .getActiveSubscriptionInfo(subscriptionId);
+ if (info == null || info.isOpportunistic()) return;
+
+ mAccounts.add(new AccountEntry(phone, false /* emergency */,
+ false /* isDummy */));
}
}