Merge Android U (ab/10368041)
Bug: 291102124
Merged-In: I70d1294d44bdf2657201285b3e281aecda467507
Change-Id: I3a4fa7051fb559fc3f7877ab4e5869b81b360340
diff --git a/Android.bp b/Android.bp
index 4097571..892a48a 100644
--- a/Android.bp
+++ b/Android.bp
@@ -110,13 +110,6 @@
"modules-utils-statemachine",
],
- product_variables: {
- pdk: {
- // enable this build only when platform library is available
- enabled: false,
- },
- },
-
optimize: {
enabled: true,
shrink: true,
diff --git a/OWNERS b/OWNERS
index a061cf0..35f2818 100644
--- a/OWNERS
+++ b/OWNERS
@@ -2,8 +2,8 @@
amallampati@google.com
amruthr@google.com
breadley@google.com
-chinmayd@google.com
fionaxu@google.com
+grantmenke@google.com
huiwang@google.com
jackyu@google.com
jayachandranc@google.com
diff --git a/src/java/com/android/internal/telephony/NetworkTypeController.java b/src/java/com/android/internal/telephony/NetworkTypeController.java
index f94ff26..beebf22 100644
--- a/src/java/com/android/internal/telephony/NetworkTypeController.java
+++ b/src/java/com/android/internal/telephony/NetworkTypeController.java
@@ -162,6 +162,7 @@
private boolean mIsTimerResetEnabledForLegacyStateRrcIdle;
private int mLtePlusThresholdBandwidth;
private int mNrAdvancedThresholdBandwidth;
+ private boolean mIncludeLteForNrAdvancedThresholdBandwidth;
private @NonNull int[] mAdditionalNrAdvancedBandsList;
private @NonNull String mPrimaryTimerState;
private @NonNull String mSecondaryTimerState;
@@ -290,6 +291,8 @@
CarrierConfigManager.KEY_LTE_PLUS_THRESHOLD_BANDWIDTH_KHZ_INT);
mNrAdvancedThresholdBandwidth = config.getInt(
CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT);
+ mIncludeLteForNrAdvancedThresholdBandwidth = config.getBoolean(
+ CarrierConfigManager.KEY_INCLUDE_LTE_FOR_NR_ADVANCED_THRESHOLD_BANDWIDTH_BOOL);
mEnableNrAdvancedWhileRoaming = config.getBoolean(
CarrierConfigManager.KEY_ENABLE_NR_ADVANCED_WHILE_ROAMING_BOOL);
mAdditionalNrAdvancedBandsList = config.getIntArray(
@@ -1281,11 +1284,20 @@
return false;
}
+ int bandwidths = 0;
+ if (mPhone.getServiceStateTracker().getPhysicalChannelConfigList() != null) {
+ bandwidths = mPhone.getServiceStateTracker().getPhysicalChannelConfigList()
+ .stream()
+ .filter(config -> mIncludeLteForNrAdvancedThresholdBandwidth
+ || config.getNetworkType() == TelephonyManager.NETWORK_TYPE_NR)
+ .map(PhysicalChannelConfig::getCellBandwidthDownlinkKhz)
+ .mapToInt(Integer::intValue)
+ .sum();
+ }
+
// Check if meeting minimum bandwidth requirement. For most carriers, there is no minimum
// bandwidth requirement and mNrAdvancedThresholdBandwidth is 0.
- if (mNrAdvancedThresholdBandwidth > 0
- && IntStream.of(mPhone.getServiceState().getCellBandwidths()).sum()
- < mNrAdvancedThresholdBandwidth) {
+ if (mNrAdvancedThresholdBandwidth > 0 && bandwidths < mNrAdvancedThresholdBandwidth) {
return false;
}
diff --git a/src/java/com/android/internal/telephony/SignalStrengthController.java b/src/java/com/android/internal/telephony/SignalStrengthController.java
index 59f7333..8c35e57 100644
--- a/src/java/com/android/internal/telephony/SignalStrengthController.java
+++ b/src/java/com/android/internal/telephony/SignalStrengthController.java
@@ -26,6 +26,8 @@
import android.os.IBinder;
import android.os.Message;
import android.os.PersistableBundle;
+import android.os.Registrant;
+import android.os.RegistrantList;
import android.os.RemoteException;
import android.telephony.AccessNetworkConstants;
import android.telephony.CarrierConfigManager;
@@ -102,7 +104,8 @@
private final Phone mPhone;
@NonNull
private final CommandsInterface mCi;
-
+ @NonNull
+ private final RegistrantList mSignalStrengthChangedRegistrants = new RegistrantList();
@NonNull
private SignalStrength mSignalStrength;
private long mSignalStrengthUpdatedTime;
@@ -291,31 +294,38 @@
}
/**
- * send signal-strength-changed notification if changed Called both for
- * solicited and unsolicited signal strength updates
- *
- * @return true if the signal strength changed and a notification was sent.
+ * Send signal-strength-changed notification if changed. Called for both solicited and
+ * unsolicited signal strength updates.
*/
- private boolean onSignalStrengthResult(@NonNull AsyncResult ar) {
+ private void onSignalStrengthResult(@NonNull AsyncResult ar) {
+ // This signal is used for both voice and data radio signal so parse all fields.
- // This signal is used for both voice and data radio signal so parse
- // all fields
-
+ SignalStrength signalStrength;
if ((ar.exception == null) && (ar.result != null)) {
- mSignalStrength = (SignalStrength) ar.result;
-
- if (mPhone.getServiceStateTracker() != null) {
- mSignalStrength.updateLevel(mCarrierConfig, mPhone.getServiceStateTracker().mSS);
- }
+ signalStrength = (SignalStrength) ar.result;
} else {
- log("onSignalStrengthResult() Exception from RIL : " + ar.exception);
- mSignalStrength = new SignalStrength();
+ loge("onSignalStrengthResult() Exception from RIL : " + ar.exception);
+ signalStrength = new SignalStrength();
+ }
+ updateSignalStrength(signalStrength);
+ }
+
+ /**
+ * Set {@code mSignalStrength} to the input argument {@code signalStrength}, update its level,
+ * and send signal-strength-changed notification if changed.
+ *
+ * @param signalStrength The new SignalStrength used for updating {@code mSignalStrength}.
+ */
+ private void updateSignalStrength(@NonNull SignalStrength signalStrength) {
+ mSignalStrength = signalStrength;
+ ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
+ if (serviceStateTracker != null) {
+ mSignalStrength.updateLevel(mCarrierConfig, serviceStateTracker.mSS);
+ } else {
+ loge("updateSignalStrength: serviceStateTracker is null");
}
mSignalStrengthUpdatedTime = System.currentTimeMillis();
-
- boolean ssChanged = notifySignalStrength();
-
- return ssChanged;
+ notifySignalStrength();
}
/**
@@ -717,19 +727,36 @@
mSignalStrengthUpdatedTime = System.currentTimeMillis();
}
- boolean notifySignalStrength() {
- boolean notified = false;
+ void notifySignalStrength() {
if (!mSignalStrength.equals(mLastSignalStrength)) {
try {
+ mSignalStrengthChangedRegistrants.notifyRegistrants();
mPhone.notifySignalStrength();
- notified = true;
mLastSignalStrength = mSignalStrength;
} catch (NullPointerException ex) {
- log("updateSignalStrength() Phone already destroyed: " + ex
+ loge("updateSignalStrength() Phone already destroyed: " + ex
+ "SignalStrength not notified");
}
}
- return notified;
+ }
+
+ /**
+ * Register for SignalStrength changed.
+ * @param h Handler to notify
+ * @param what msg.what when the message is delivered
+ * @param obj msg.obj when the message is delivered
+ */
+ public void registerForSignalStrengthChanged(Handler h, int what, Object obj) {
+ Registrant r = new Registrant(h, what, obj);
+ mSignalStrengthChangedRegistrants.add(r);
+ }
+
+ /**
+ * Unregister for SignalStrength changed.
+ * @param h Handler to notify
+ */
+ public void unregisterForSignalStrengthChanged(Handler h) {
+ mSignalStrengthChangedRegistrants.remove(h);
}
/**
@@ -1109,6 +1136,7 @@
updateArfcnLists();
updateReportingCriteria();
+ updateSignalStrength(new SignalStrength(mSignalStrength));
}
private static SignalThresholdInfo createSignalThresholdsInfo(
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index 079b398..2ee1ffd 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -1588,8 +1588,8 @@
// Check if it's SUPL during emergency call.
evaluation.addDataAllowedReason(DataAllowedReason.EMERGENCY_SUPL);
} else if (!networkRequest.hasCapability(
- NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) && !networkRequest
- .hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) {
+ NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+ && isValidRestrictedRequest(networkRequest)) {
// Check if request is restricted and not for tethering, which always comes with
// a restricted network request.
evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST);
@@ -1856,9 +1856,9 @@
evaluation.addDataAllowedReason(DataAllowedReason.EMERGENCY_SUPL);
} else if (!dataNetwork.getNetworkCapabilities().hasCapability(
NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
- && !dataNetwork.hasNetworkCapabilityInNetworkRequests(
- NetworkCapabilities.NET_CAPABILITY_DUN)) {
- // Check if request is restricted and there are no DUN network requests attached to
+ && dataNetwork.getAttachedNetworkRequestList().stream()
+ .allMatch(this::isValidRestrictedRequest)) {
+ // Check if request is restricted and there are no exceptional requests attached to
// the network.
evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST);
} else if (dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
@@ -1888,6 +1888,18 @@
}
/**
+ * tethering and enterprise capabilities are not respected as restricted requests. For a request
+ * with these capabilities, any soft disallowed reasons are honored.
+ * @param networkRequest The network request to evaluate.
+ * @return {@code true} if the request doesn't contain any exceptional capabilities, its
+ * restricted capability, if any, is respected.
+ */
+ private boolean isValidRestrictedRequest(@NonNull TelephonyNetworkRequest networkRequest) {
+ return !(networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)
+ || networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE));
+ }
+
+ /**
* Called when needed to re-evaluate existing data networks and tear down networks if needed.
*
* @param reason The reason for this data evaluation.
@@ -2188,7 +2200,8 @@
@Nullable
public DataNetwork getDataNetworkByInterface(@NonNull String interfaceName) {
return mDataNetworkList.stream()
- .filter(dataNetwork -> !dataNetwork.isDisconnecting())
+ .filter(dataNetwork -> !(dataNetwork.isDisconnecting()
+ || dataNetwork.isDisconnected()))
.filter(dataNetwork -> interfaceName.equals(
dataNetwork.getLinkProperties().getInterfaceName()))
.findFirst()
diff --git a/src/java/com/android/internal/telephony/ims/ImsServiceControllerCompat.java b/src/java/com/android/internal/telephony/ims/ImsServiceControllerCompat.java
index 13ec750..778bd0e 100644
--- a/src/java/com/android/internal/telephony/ims/ImsServiceControllerCompat.java
+++ b/src/java/com/android/internal/telephony/ims/ImsServiceControllerCompat.java
@@ -118,13 +118,13 @@
public final void disableIms(int slotId, int subId) {
MmTelFeatureCompatAdapter adapter = mMmTelCompatAdapters.get(slotId);
if (adapter == null) {
- Log.w(TAG, "enableIms: adapter null for slot :" + slotId);
+ Log.w(TAG, "disableIms: adapter null for slot :" + slotId);
return;
}
try {
adapter.disableIms();
} catch (RemoteException e) {
- Log.w(TAG, "Couldn't enable IMS: " + e.getMessage());
+ Log.w(TAG, "Couldn't disableIms IMS: " + e.getMessage());
}
}
diff --git a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
index f9720df..c56ee04 100644
--- a/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
+++ b/src/java/com/android/internal/telephony/subscription/SubscriptionManagerService.java
@@ -46,6 +46,7 @@
import android.os.RemoteException;
import android.os.TelephonyServiceManager;
import android.os.UserHandle;
+import android.os.UserManager;
import android.provider.Settings;
import android.provider.Telephony.SimInfo;
import android.service.carrier.CarrierIdentifier;
@@ -88,6 +89,7 @@
import com.android.internal.telephony.MultiSimSettingController;
import com.android.internal.telephony.Phone;
import com.android.internal.telephony.PhoneFactory;
+import com.android.internal.telephony.ProxyController;
import com.android.internal.telephony.RILConstants;
import com.android.internal.telephony.TelephonyIntents;
import com.android.internal.telephony.TelephonyPermissions;
@@ -1388,7 +1390,7 @@
loge("updateSubscription: sim country iso is null");
}
- String msisdn = mTelephonyManager.getLine1Number(subId);
+ String msisdn = PhoneFactory.getPhone(phoneId).getLine1Number();
if (!TextUtils.isEmpty(msisdn)) {
setDisplayNumber(msisdn, subId);
}
@@ -2791,6 +2793,8 @@
final long token = Binder.clearCallingIdentity();
try {
if (mDefaultDataSubId.set(subId)) {
+ remapRafIfApplicable();
+
MultiSimSettingController.getInstance().notifyDefaultDataSubChanged();
broadcastSubId(TelephonyIntents.ACTION_DEFAULT_DATA_SUBSCRIPTION_CHANGED,
@@ -2804,6 +2808,23 @@
}
/**
+ * Remap Radio Access Family if needed.
+ */
+ private void remapRafIfApplicable() {
+ boolean applicable = mSlotIndexToSubId.containsValue(getDefaultDataSubId());
+ if (!applicable) return;
+ ProxyController proxyController = ProxyController.getInstance();
+ RadioAccessFamily[] rafs = new RadioAccessFamily[mTelephonyManager.getActiveModemCount()];
+ for (int phoneId = 0; phoneId < rafs.length; phoneId++) {
+ int raf = mSlotIndexToSubId.getOrDefault(phoneId,
+ SubscriptionManager.INVALID_SUBSCRIPTION_ID) == getDefaultDataSubId()
+ ? proxyController.getMaxRafSupported() : proxyController.getMinRafSupported();
+ rafs[phoneId] = new RadioAccessFamily(phoneId, raf);
+ }
+ proxyController.setRadioCapability(rafs);
+ }
+
+ /**
* @return The default subscription id for voice.
*/
@Override
@@ -3364,7 +3385,7 @@
try {
switch(source) {
case SubscriptionManager.PHONE_NUMBER_SOURCE_UICC:
- Phone phone = PhoneFactory.getPhone(getPhoneId(subId));
+ Phone phone = PhoneFactory.getPhone(getSlotIndex(subId));
if (phone != null) {
return TextUtils.emptyIfNull(phone.getLine1Number());
} else {
@@ -3665,6 +3686,15 @@
}
}
+ UserManager userManager = mContext.getSystemService(UserManager.class);
+ if ((userManager != null)
+ && (userManager.isManagedProfile(userHandle.getIdentifier()))) {
+ // For work profile, return subscriptions associated only with work profile
+ return subscriptionsAssociatedWithUser;
+ }
+
+ // For all other profiles, if subscriptionsAssociatedWithUser is empty return all the
+ // subscriptionsWithNoAssociation.
return subscriptionsAssociatedWithUser.isEmpty() ?
subscriptionsWithNoAssociation : subscriptionsAssociatedWithUser;
} finally {
@@ -3839,10 +3869,13 @@
case TelephonyManager.SIM_STATE_PUK_REQUIRED:
case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
case TelephonyManager.SIM_STATE_PERM_DISABLED:
- case TelephonyManager.SIM_STATE_READY:
case TelephonyManager.SIM_STATE_CARD_IO_ERROR:
case TelephonyManager.SIM_STATE_LOADED:
+ updateSubscription(slotIndex);
+ break;
case TelephonyManager.SIM_STATE_NOT_READY:
+ case TelephonyManager.SIM_STATE_READY:
+ updateEmbeddedSubscriptions();
updateSubscription(slotIndex);
break;
case TelephonyManager.SIM_STATE_CARD_RESTRICTED:
diff --git a/src/java/com/android/internal/telephony/uicc/UiccController.java b/src/java/com/android/internal/telephony/uicc/UiccController.java
index 566bec2..9456467 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccController.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccController.java
@@ -804,12 +804,14 @@
UiccSlot slot = UiccController.getInstance().getUiccSlotForPhone(phoneId);
int slotId = UiccController.getInstance().getSlotIdFromPhoneId(phoneId);
intent.putExtra(PhoneConstants.SLOT_KEY, slotId);
+ int portIndex = -1;
if (slot != null) {
- intent.putExtra(PhoneConstants.PORT_KEY, slot.getPortIndexFromPhoneId(phoneId));
+ portIndex = slot.getPortIndexFromPhoneId(phoneId);
+ intent.putExtra(PhoneConstants.PORT_KEY, portIndex);
}
Rlog.d(LOG_TAG, "Broadcasting intent ACTION_SIM_CARD_STATE_CHANGED "
+ TelephonyManager.simStateToString(state) + " for phone: " + phoneId
- + " slot: " + slotId + " port: " + slot.getPortIndexFromPhoneId(phoneId));
+ + " slot: " + slotId + " port: " + portIndex);
mContext.sendBroadcast(intent, Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
TelephonyMetrics.getInstance().updateSimState(phoneId, state);
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
index ff696fc..e171a5e 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/NetworkTypeControllerTest.java
@@ -1278,7 +1278,34 @@
mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT, 20000);
sendCarrierConfigChanged();
- mNetworkTypeController.sendMessage(11 /* EVENT_PHYSICAL_CHANNEL_CONFIG_CHANGED */);
+ mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
+ processAllMessages();
+ assertEquals("connected_mmwave", getCurrentState().getName());
+ }
+
+ @Test
+ public void testTransitionToCurrentStateNrConnectedWithHighBandwidthIncludingLte()
+ throws Exception {
+ assertEquals("DefaultState", getCurrentState().getName());
+ doReturn(NetworkRegistrationInfo.NR_STATE_CONNECTED).when(mServiceState).getNrState();
+ doReturn(ServiceState.FREQUENCY_RANGE_MMWAVE).when(mServiceState).getNrFrequencyRange();
+ List<PhysicalChannelConfig> lastPhysicalChannelConfigList = new ArrayList<>();
+ lastPhysicalChannelConfigList.add(new PhysicalChannelConfig.Builder()
+ .setNetworkType(TelephonyManager.NETWORK_TYPE_NR)
+ .setCellBandwidthDownlinkKhz(20000)
+ .build());
+ lastPhysicalChannelConfigList.add(new PhysicalChannelConfig.Builder()
+ .setNetworkType(TelephonyManager.NETWORK_TYPE_LTE)
+ .setCellBandwidthDownlinkKhz(10000)
+ .build());
+ doReturn(lastPhysicalChannelConfigList).when(mSST).getPhysicalChannelConfigList();
+ mBundle.putInt(CarrierConfigManager.KEY_NR_ADVANCED_THRESHOLD_BANDWIDTH_KHZ_INT, 20000);
+ mBundle.putBoolean(
+ CarrierConfigManager.KEY_INCLUDE_LTE_FOR_NR_ADVANCED_THRESHOLD_BANDWIDTH_BOOL,
+ true);
+ sendCarrierConfigChanged();
+
+ mNetworkTypeController.sendMessage(NetworkTypeController.EVENT_UPDATE);
processAllMessages();
assertEquals("connected_mmwave", getCurrentState().getName());
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java
index b2f118d..e4617fe 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SignalStrengthControllerTest.java
@@ -946,6 +946,72 @@
1 /*expectedNonEmptyThreshold*/);
}
+ @Test
+ public void testSignalStrengthChangedCallback() {
+ Handler mockRegistrant = Mockito.mock(Handler.class);
+ int ssChangedEvent = 0;
+ mSsc.registerForSignalStrengthChanged(mockRegistrant, ssChangedEvent, null);
+ mSimulatedCommands.notifySignalStrength();
+ processAllMessages();
+
+ ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);
+ verify(mockRegistrant).sendMessageDelayed(msgCaptor.capture(), Mockito.anyLong());
+ assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
+ }
+
+ @Test
+ public void testSignalStrengthLevelUpdatedDueToCarrierConfigChanged() {
+ Handler mockRegistrant = Mockito.mock(Handler.class);
+ ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);
+ int ssChangedEvent = 0;
+ mSsc.registerForSignalStrengthChanged(mockRegistrant, ssChangedEvent, null);
+
+ SignalStrength ss = new SignalStrength(
+ new CellSignalStrengthCdma(),
+ new CellSignalStrengthGsm(),
+ new CellSignalStrengthWcdma(),
+ new CellSignalStrengthTdscdma(),
+ new CellSignalStrengthLte(
+ -110, /* rssi */
+ -114, /* rsrp */
+ -5, /* rsrq */
+ 0, /* rssnr */
+ SignalStrength.INVALID, /* cqi */
+ SignalStrength.INVALID /* ta */),
+ new CellSignalStrengthNr());
+
+ mBundle.putBoolean(CarrierConfigManager.KEY_USE_ONLY_RSRP_FOR_LTE_SIGNAL_BAR_BOOL, true);
+
+ sendCarrierConfigUpdate();
+ verify(mockRegistrant).sendMessageDelayed(msgCaptor.capture(), Mockito.anyLong());
+ assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
+ assertEquals(CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN,
+ mSsc.getSignalStrength().getLevel());
+
+ Mockito.clearInvocations(mockRegistrant);
+ mSimulatedCommands.setSignalStrength(ss);
+ mSimulatedCommands.notifySignalStrength();
+ processAllMessages();
+ // Default thresholds are POOR=-115 MODERATE=-105 GOOD=-95 GREAT=-85
+ assertEquals(CellSignalStrength.SIGNAL_STRENGTH_POOR, mSsc.getSignalStrength().getLevel());
+ verify(mockRegistrant).sendMessageDelayed(msgCaptor.capture(), Mockito.anyLong());
+ assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
+
+ Mockito.clearInvocations(mockRegistrant);
+ int[] lteThresholds = {
+ -130, // SIGNAL_STRENGTH_POOR
+ -120, // SIGNAL_STRENGTH_MODERATE
+ -110, // SIGNAL_STRENGTH_GOOD
+ -100, // SIGNAL_STRENGTH_GREAT
+ };
+ mBundle.putIntArray(CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, lteThresholds);
+ sendCarrierConfigUpdate();
+ assertEquals(CellSignalStrength.SIGNAL_STRENGTH_MODERATE,
+ mSsc.getSignalStrength().getLevel());
+ verify(mockRegistrant).sendMessageDelayed(msgCaptor.capture(), Mockito.anyLong());
+ assertThat(msgCaptor.getValue().what).isEqualTo(ssChangedEvent);
+ }
+
private void verifyAllEmptyThresholdAreDisabledWhenSetSignalStrengthReportingCriteria(
int expectedNonEmptyThreshold) {
ArgumentCaptor<List<SignalThresholdInfo>> signalThresholdInfoCaptor =
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
index 62a797c..808a15d 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -687,10 +687,10 @@
mCarrierConfig.putBoolean(CarrierConfigManager.KEY_CARRIER_CONFIG_APPLIED_BOOL, true);
mCarrierConfig.putStringArray(
CarrierConfigManager.KEY_CARRIER_METERED_APN_TYPES_STRINGS,
- new String[]{"default", "mms", "dun", "supl"});
+ new String[]{"default", "mms", "dun", "supl", "enterprise"});
mCarrierConfig.putStringArray(
CarrierConfigManager.KEY_CARRIER_METERED_ROAMING_APN_TYPES_STRINGS,
- new String[]{"default", "mms", "dun", "supl"});
+ new String[]{"default", "mms", "dun", "supl", "enterprise"});
mCarrierConfig.putStringArray(
CarrierConfigManager.KEY_TELEPHONY_DATA_SETUP_RETRY_RULES_STRING_ARRAY,
@@ -1247,8 +1247,12 @@
.getDataProfileForNetworkRequest(any(TelephonyNetworkRequest.class), anyInt(),
anyBoolean());
- mDataNetworkControllerUT.addNetworkRequest(
- createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE));
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+ mDataNetworkControllerUT.addNetworkRequest(new TelephonyNetworkRequest(
+ new NetworkRequest(netCaps, ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone));
processAllMessages();
verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE);
List<DataNetwork> dataNetworkList = getDataNetworks();
@@ -3204,6 +3208,17 @@
processAllMessages();
verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_DUN);
+ }
+
+ @Test
+ public void testDataDisableTearingDownEnterpriseNetwork() throws Exception {
+ // User data enabled
+ mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled(
+ TelephonyManager.DATA_ENABLED_REASON_USER, true, mContext.getOpPackageName());
+ processAllMessages();
+
+ // Request the restricted enterprise network.
+ testSetupEnterpriseDataNetwork();
// User data disabled
mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled(
@@ -3310,6 +3325,43 @@
}
@Test
+ public void testDataDisableNotAllowingBringingUpEnterpriseNetwork() throws Exception {
+ // User data disabled
+ mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled(
+ TelephonyManager.DATA_ENABLED_REASON_USER, false, mContext.getOpPackageName());
+ processAllMessages();
+
+ // Request the restricted tethering network.
+ List<TrafficDescriptor> tdList = new ArrayList<>();
+ tdList.add(new TrafficDescriptor.Builder()
+ .setOsAppId(new OsAppId(OsAppId.ANDROID_OS_ID, "ENTERPRISE", 1).getBytes())
+ .build());
+ setSuccessfulSetupDataResponse(mMockedWwanDataServiceManager,
+ createDataCallResponse(1, DataCallResponse.LINK_STATUS_ACTIVE, tdList));
+ doReturn(mEnterpriseDataProfile).when(mDataProfileManager)
+ .getDataProfileForNetworkRequest(any(TelephonyNetworkRequest.class), anyInt(),
+ anyBoolean());
+
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_ENTERPRISE);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+
+ NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
+ ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST);
+
+ mDataNetworkControllerUT.addNetworkRequest(
+ new TelephonyNetworkRequest(nativeNetworkRequest, mPhone));
+ processAllMessages();
+
+ // Everything should be disconnected.
+ verifyAllDataDisconnected();
+
+ // Telephony should not try to setup a data call for Enterprise.
+ verify(mMockedWwanDataServiceManager, never()).setupDataCall(anyInt(),
+ any(DataProfile.class), anyBoolean(), anyBoolean(), anyInt(), any(), anyInt(),
+ any(), any(), anyBoolean(), any(Message.class));
+ }
+ @Test
public void testNonVoPSNoIMSSetup() throws Exception {
DataSpecificRegistrationInfo dsri = new DataSpecificRegistrationInfo.Builder(8)
.setNrAvailable(true)
diff --git a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsCallTest.java b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsCallTest.java
index aa07125..b869c9b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsCallTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsCallTest.java
@@ -17,6 +17,7 @@
package com.android.internal.telephony.imsphone;
import static junit.framework.Assert.assertNotNull;
+import static junit.framework.Assert.assertNull;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -237,4 +238,40 @@
assertFalse(mTestImsCall.isWifiCall());
assertEquals(mTestImsCall.getNetworkType(), TelephonyManager.NETWORK_TYPE_LTE);
}
+
+ @Test
+ @SmallTest
+ public void testListenerCalledAfterCallClosed() throws Exception {
+ ImsCallSession mockSession = mock(ImsCallSession.class);
+ ImsCall testImsCall = new ImsCall(mContext, mTestCallProfile);
+ ImsCallProfile profile = new ImsCallProfile();
+ when(mockSession.getCallProfile()).thenReturn(profile);
+ testImsCall.attachSession(mockSession);
+
+ ArgumentCaptor<ImsCallSession.Listener> listenerCaptor =
+ ArgumentCaptor.forClass(ImsCallSession.Listener.class);
+ verify(mockSession).setListener(listenerCaptor.capture(), any());
+ ImsCallSession.Listener listener = listenerCaptor.getValue();
+ assertNotNull(listener);
+
+ // Call closed
+ testImsCall.close();
+ // Set CallProfile value to null because ImsCallSession was closed
+ when(mockSession.getCallProfile()).thenReturn(null);
+
+ // Set new profile with direction of none
+ ImsStreamMediaProfile newProfile = new ImsStreamMediaProfile(
+ ImsStreamMediaProfile.AUDIO_QUALITY_AMR_WB,
+ ImsStreamMediaProfile.DIRECTION_INACTIVE,
+ ImsStreamMediaProfile.VIDEO_QUALITY_NONE,
+ ImsStreamMediaProfile.DIRECTION_INACTIVE,
+ ImsStreamMediaProfile.RTT_MODE_DISABLED);
+ try {
+ listener.callSessionProgressing(mockSession, newProfile);
+ } catch (Exception e) {
+ throw new AssertionError("not expected exception", e);
+ }
+
+ assertNull(testImsCall.getCallProfile());
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
index 38b495a..cae9626 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/subscription/SubscriptionManagerServiceTest.java
@@ -163,6 +163,7 @@
// Dual-SIM configuration
mPhones = new Phone[] {mPhone, mPhone2};
replaceInstance(PhoneFactory.class, "sPhones", null, mPhones);
+ doReturn(FAKE_PHONE_NUMBER1).when(mPhone).getLine1Number();
doReturn(2).when(mTelephonyManager).getActiveModemCount();
doReturn(2).when(mTelephonyManager).getSupportedModemCount();
doReturn(mUiccProfile).when(mPhone2).getIccCard();
@@ -638,6 +639,7 @@
mSubscriptionManagerServiceUT.setDefaultDataSubId(1);
assertThat(mSubscriptionManagerServiceUT.getDefaultDataSubId()).isEqualTo(1);
+ verify(mProxyController).setRadioCapability(any());
assertThat(Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.MULTI_SIM_DATA_CALL_SUBSCRIPTION)).isEqualTo(1);
@@ -665,6 +667,26 @@
}
@Test
+ public void testSingleSimSetDefaultDataSubId() {
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
+ doReturn(1).when(mProxyController).getMinRafSupported();
+ doReturn(2).when(mProxyController).getMaxRafSupported();
+ insertSubscription(FAKE_SUBSCRIPTION_INFO2);
+
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
+
+ mSubscriptionManagerServiceUT.setDefaultDataSubId(1);
+ assertThat(mSubscriptionManagerServiceUT.getDefaultDataSubId()).isEqualTo(1);
+ ArgumentCaptor<RadioAccessFamily[]> rafsCaptor = ArgumentCaptor.forClass(
+ RadioAccessFamily[].class);
+ verify(mProxyController).setRadioCapability(rafsCaptor.capture());
+ RadioAccessFamily[] rafs = (RadioAccessFamily[]) rafsCaptor.getValue();
+ assertThat(rafs[0].getRadioAccessFamily()).isEqualTo(1);
+ assertThat(rafs[1].getRadioAccessFamily()).isEqualTo(2);
+ }
+
+ @Test
public void testSetDefaultSmsSubId() throws Exception {
clearInvocations(mContext);
insertSubscription(FAKE_SUBSCRIPTION_INFO1);
@@ -1839,7 +1861,6 @@
doReturn(FAKE_IMSI1).when(mTelephonyManager).getSubscriberId();
doReturn(FAKE_MCC1 + FAKE_MNC1).when(mTelephonyManager).getSimOperatorNumeric(anyInt());
- doReturn(FAKE_PHONE_NUMBER1).when(mTelephonyManager).getLine1Number(anyInt());
doReturn(FAKE_EHPLMNS1.split(",")).when(mSimRecords).getEhplmns();
doReturn(FAKE_HPLMNS1.split(",")).when(mSimRecords).getPlmnsFromHplmnActRecord();
doReturn(0).when(mUiccSlot).getPortIndexFromIccId(anyString());
@@ -1914,6 +1935,105 @@
}
@Test
+ public void testGetPhoneNumberFromInactiveSubscription() {
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
+ testInactiveSimRemoval();
+
+ int subId = insertSubscription(FAKE_SUBSCRIPTION_INFO1);
+ assertThat(subId).isEqualTo(2);
+ assertThat(mSubscriptionManagerServiceUT.getActiveSubIdList(false)).hasLength(1);
+ assertThat(mSubscriptionManagerServiceUT.getAllSubInfoList(CALLING_PACKAGE,
+ CALLING_FEATURE)).hasSize(2);
+
+ assertThat(mSubscriptionManagerServiceUT.getPhoneNumberFromFirstAvailableSource(1,
+ CALLING_PACKAGE, CALLING_FEATURE)).isEqualTo(FAKE_PHONE_NUMBER2);
+ assertThat(mSubscriptionManagerServiceUT.getPhoneNumber(1,
+ SubscriptionManager.PHONE_NUMBER_SOURCE_UICC, CALLING_PACKAGE, CALLING_FEATURE))
+ .isEqualTo(FAKE_PHONE_NUMBER2);
+ }
+
+ @Test
+ public void testEsimActivation() {
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
+ EuiccProfileInfo profileInfo1 = new EuiccProfileInfo.Builder(FAKE_ICCID1)
+ .setIccid(FAKE_ICCID1)
+ .setNickname(FAKE_CARRIER_NAME1)
+ .setProfileClass(SubscriptionManager.PROFILE_CLASS_OPERATIONAL)
+ .setCarrierIdentifier(new CarrierIdentifier(FAKE_MCC1, FAKE_MNC1, null, null, null,
+ null, FAKE_CARRIER_ID1, FAKE_CARRIER_ID1))
+ .setUiccAccessRule(Arrays.asList(UiccAccessRule.decodeRules(
+ FAKE_NATIVE_ACCESS_RULES1)))
+ .build();
+
+ GetEuiccProfileInfoListResult result = new GetEuiccProfileInfoListResult(
+ EuiccService.RESULT_OK, new EuiccProfileInfo[]{profileInfo1}, false);
+ doReturn(result).when(mEuiccController).blockingGetEuiccProfileInfoList(eq(1));
+
+ mSubscriptionManagerServiceUT.updateEmbeddedSubscriptions(List.of(1), null);
+ processAllMessages();
+
+ SubscriptionInfoInternal subInfo = mSubscriptionManagerServiceUT
+ .getSubscriptionInfoInternal(1);
+ assertThat(subInfo.getSubscriptionId()).isEqualTo(1);
+ assertThat(subInfo.isActive()).isFalse();
+ assertThat(subInfo.getIccId()).isEqualTo(FAKE_ICCID1);
+ assertThat(subInfo.getDisplayName()).isEqualTo(FAKE_CARRIER_NAME1);
+
+ Mockito.clearInvocations(mEuiccController);
+
+ mSubscriptionManagerServiceUT.updateSimState(
+ 0, TelephonyManager.SIM_STATE_ABSENT, null, null);
+ mSubscriptionManagerServiceUT.updateSimState(
+ 1, TelephonyManager.SIM_STATE_UNKNOWN, null, null);
+ processAllMessages();
+
+ doReturn(FAKE_IMSI1).when(mTelephonyManager).getSubscriberId();
+ doReturn(FAKE_MCC1 + FAKE_MNC1).when(mTelephonyManager).getSimOperatorNumeric(anyInt());
+ doReturn(FAKE_PHONE_NUMBER1).when(mPhone2).getLine1Number();
+ doReturn(FAKE_EHPLMNS1.split(",")).when(mSimRecords).getEhplmns();
+ doReturn(FAKE_HPLMNS1.split(",")).when(mSimRecords).getPlmnsFromHplmnActRecord();
+ doReturn(0).when(mUiccSlot).getPortIndexFromIccId(anyString());
+ doReturn(true).when(mUiccSlot).isEuicc();
+ doReturn(1).when(mUiccController).convertToPublicCardId(eq(FAKE_ICCID1));
+
+ mSubscriptionManagerServiceUT.updateSimState(
+ 1, TelephonyManager.SIM_STATE_READY, null, null);
+ processAllMessages();
+
+ mSubscriptionManagerServiceUT.updateSimState(
+ 1, TelephonyManager.SIM_STATE_LOADED, null, null);
+ processAllMessages();
+
+ // Verify if SMSVC is refreshing eSIM profiles when moving into READY state.
+ verify(mEuiccController).blockingGetEuiccProfileInfoList(eq(1));
+
+ List<SubscriptionInfo> subInfoList = mSubscriptionManagerServiceUT
+ .getActiveSubscriptionInfoList(CALLING_PACKAGE, CALLING_FEATURE);
+ assertThat(subInfoList).hasSize(1);
+ assertThat(subInfoList.get(0).getSimSlotIndex()).isEqualTo(1);
+ assertThat(subInfoList.get(0).getSubscriptionId()).isEqualTo(1);
+
+ subInfo = mSubscriptionManagerServiceUT.getSubscriptionInfoInternal(1);
+ assertThat(subInfo.isActive()).isTrue();
+ assertThat(subInfo.getSimSlotIndex()).isEqualTo(1);
+ assertThat(subInfo.getPortIndex()).isEqualTo(0);
+ assertThat(subInfo.isEmbedded()).isTrue();
+ assertThat(subInfo.getCarrierId()).isEqualTo(TelephonyManager.UNKNOWN_CARRIER_ID);
+ assertThat(subInfo.getDisplayName()).isEqualTo(FAKE_CARRIER_NAME1);
+ assertThat(subInfo.isOpportunistic()).isFalse();
+ assertThat(subInfo.getNumber()).isEqualTo(FAKE_PHONE_NUMBER1);
+ assertThat(subInfo.getMcc()).isEqualTo(FAKE_MCC1);
+ assertThat(subInfo.getMnc()).isEqualTo(FAKE_MNC1);
+ assertThat(subInfo.getEhplmns()).isEqualTo(FAKE_EHPLMNS1);
+ assertThat(subInfo.getHplmns()).isEqualTo(FAKE_HPLMNS1);
+ assertThat(subInfo.getCardString()).isEqualTo(FAKE_ICCID1);
+ assertThat(subInfo.getCardId()).isEqualTo(1);
+ assertThat(subInfo.getSubscriptionType()).isEqualTo(
+ SubscriptionManager.SUBSCRIPTION_TYPE_LOCAL_SIM);
+ }
+
+ @Test
public void testDeleteEsim() {
mContextFixture.addCallingOrSelfPermission(Manifest.permission.READ_PRIVILEGED_PHONE_STATE);
// pSIM with ICCID2
@@ -2001,6 +2121,7 @@
0, TelephonyManager.SIM_STATE_READY, null, null);
processAllMessages();
+ mContextFixture.addCallingOrSelfPermission(Manifest.permission.MODIFY_PHONE_STATE);
mSubscriptionManagerServiceUT.updateSimState(
0, TelephonyManager.SIM_STATE_LOADED, null, null);
processAllMessages();