Merge changes from topic "sim_display_name_pnn"
* changes:
Fixed that SIM name not updated issue
When SPN is empty, use PNN in mobile network settings
Push a full channel config after SIM swapped
Fixed handover issue on connecting data connection
Improved debug messages
Fixed locale tracker logging
diff --git a/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java b/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
index d2f256a..66a86e6 100644
--- a/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
+++ b/src/java/com/android/internal/telephony/IccSmsInterfaceManager.java
@@ -24,8 +24,11 @@
import android.annotation.UnsupportedAppUsage;
import android.app.AppOpsManager;
import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
import android.content.ContentResolver;
import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.database.sqlite.SQLiteException;
@@ -36,9 +39,11 @@
import android.os.Message;
import android.os.UserManager;
import android.provider.Telephony;
+import android.telephony.CarrierConfigManager;
import android.telephony.Rlog;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
+import android.telephony.SubscriptionManager;
import android.telephony.emergency.EmergencyNumber;
import android.util.LocalLog;
import android.util.Log;
@@ -181,6 +186,21 @@
mAppOps = appOps;
mDispatchersController = dispatchersController;
mSmsPermissions = new SmsPermissions(phone, context, appOps);
+
+ mContext.registerReceiver(
+ new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED
+ .equals(intent.getAction())) {
+ if (mPhone.getPhoneId() == intent.getIntExtra(
+ CarrierConfigManager.EXTRA_SLOT_INDEX,
+ SubscriptionManager.INVALID_SIM_SLOT_INDEX)) {
+ mCellBroadcastRangeManager.updateRanges();
+ }
+ }
+ }
+ }, new IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED));
}
protected void markMessagesAsRead(ArrayList<byte[]> messages) {
diff --git a/src/java/com/android/internal/telephony/LocaleTracker.java b/src/java/com/android/internal/telephony/LocaleTracker.java
index 4b8a043..40e94eb 100755
--- a/src/java/com/android/internal/telephony/LocaleTracker.java
+++ b/src/java/com/android/internal/telephony/LocaleTracker.java
@@ -58,7 +58,6 @@
*/
public class LocaleTracker extends Handler {
private static final boolean DBG = true;
- private static final String TAG = LocaleTracker.class.getSimpleName();
/** Event for getting cell info from the modem */
private static final int EVENT_REQUEST_CELL_INFO = 1;
@@ -125,6 +124,8 @@
/** The maximum fail count to prevent delay time overflow */
private static final int MAX_FAIL_COUNT = 30;
+ private String mTag;
+
private final Phone mPhone;
private final NitzStateMachine mNitzStateMachine;
@@ -241,6 +242,7 @@
mPhone = phone;
mNitzStateMachine = nitzStateMachine;
mSimState = TelephonyManager.SIM_STATE_UNKNOWN;
+ mTag = LocaleTracker.class.getSimpleName() + "-" + mPhone.getPhoneId();
final IntentFilter filter = new IntentFilter();
filter.addAction(TelephonyManager.ACTION_SIM_CARD_STATE_CHANGED);
@@ -611,11 +613,11 @@
}
private void log(String msg) {
- Rlog.d(TAG, msg);
+ Rlog.d(mTag, msg);
}
private void loge(String msg) {
- Rlog.e(TAG, msg);
+ Rlog.e(mTag, msg);
}
/**
@@ -627,7 +629,7 @@
*/
public void dump(FileDescriptor fd, PrintWriter pw, String[] args) {
final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, " ");
- pw.println("LocaleTracker:");
+ pw.println("LocaleTracker-" + mPhone.getPhoneId() + ":");
ipw.increaseIndent();
ipw.println("mIsTracking = " + mIsTracking);
ipw.println("mOperatorNumeric = " + mOperatorNumeric);
diff --git a/src/java/com/android/internal/telephony/SubscriptionController.java b/src/java/com/android/internal/telephony/SubscriptionController.java
index 7edf953..08112f0 100644
--- a/src/java/com/android/internal/telephony/SubscriptionController.java
+++ b/src/java/com/android/internal/telephony/SubscriptionController.java
@@ -46,6 +46,7 @@
import android.telephony.Rlog;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
+import android.telephony.SubscriptionManager.SimDisplayNameSource;
import android.telephony.TelephonyManager;
import android.telephony.UiccAccessRule;
import android.telephony.UiccSlotInfo;
@@ -1505,30 +1506,27 @@
* @param nameSource Source of display name
* @return int representing the priority. Higher value means higher priority.
*/
- public static int getNameSourcePriority(int nameSource) {
- switch (nameSource) {
- case SubscriptionManager.NAME_SOURCE_USER_INPUT:
- return 3;
- case SubscriptionManager.NAME_SOURCE_CARRIER:
- return 2;
- case SubscriptionManager.NAME_SOURCE_SIM_SOURCE:
- return 1;
- case SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE:
- default:
- return 0;
- }
+ public static int getNameSourcePriority(@SimDisplayNameSource int nameSource) {
+ int index = Arrays.asList(
+ SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE,
+ SubscriptionManager.NAME_SOURCE_SIM_PNN,
+ SubscriptionManager.NAME_SOURCE_SIM_SPN,
+ SubscriptionManager.NAME_SOURCE_CARRIER,
+ SubscriptionManager.NAME_SOURCE_USER_INPUT // user has highest priority.
+ ).indexOf(nameSource);
+ return (index < 0) ? 0 : index;
}
/**
* Set display name by simInfo index with name source
* @param displayName the display name of SIM card
* @param subId the unique SubInfoRecord index in database
- * @param nameSource 0: NAME_SOURCE_DEFAULT_SOURCE, 1: NAME_SOURCE_SIM_SOURCE,
- * 2: NAME_SOURCE_USER_INPUT, 3: NAME_SOURCE_CARRIER
+ * @param nameSource SIM display name source
* @return the number of records updated
*/
@Override
- public int setDisplayNameUsingSrc(String displayName, int subId, int nameSource) {
+ public int setDisplayNameUsingSrc(String displayName, int subId,
+ @SimDisplayNameSource int nameSource) {
if (DBG) {
logd("[setDisplayName]+ displayName:" + displayName + " subId:" + subId
+ " nameSource:" + nameSource);
@@ -1548,6 +1546,10 @@
&& (getNameSourcePriority(subInfo.getNameSource())
> getNameSourcePriority(nameSource)
|| (displayName != null && displayName.equals(subInfo.getDisplayName())))) {
+ logd("Name source " + subInfo.getNameSource() + "'s priority "
+ + getNameSourcePriority(subInfo.getNameSource()) + " is greater than "
+ + "name source " + nameSource + "'s priority "
+ + getNameSourcePriority(nameSource) + ", return now.");
return 0;
}
}
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
index 84541e0e..658ba6e 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataConnection.java
@@ -417,7 +417,8 @@
return getCurrentState() == mDisconnectingState;
}
- boolean isActive() {
+ @VisibleForTesting
+ public boolean isActive() {
return getCurrentState() == mActiveState;
}
@@ -2090,7 +2091,7 @@
mDisabledApnTypeBitMask |= getDisallowedApnTypes();
- mNetworkAgent = DcNetworkAgent.createDcNetworkAgent(DataConnection.this,
+ mNetworkAgent = new DcNetworkAgent(DataConnection.this,
mPhone, mNetworkInfo, mScore, misc, factorySerialNumber, mTransportType);
}
diff --git a/src/java/com/android/internal/telephony/dataconnection/DcNetworkAgent.java b/src/java/com/android/internal/telephony/dataconnection/DcNetworkAgent.java
index ed5ad1b..87152f2 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DcNetworkAgent.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DcNetworkAgent.java
@@ -39,7 +39,6 @@
import java.io.FileDescriptor;
import java.io.PrintWriter;
-import java.util.concurrent.atomic.AtomicInteger;
/**
* This class represents a network agent which is communication channel between
@@ -66,23 +65,20 @@
private final LocalLog mNetCapsLocalLog = new LocalLog(50);
- private static AtomicInteger sSerialNumber = new AtomicInteger(0);
-
private NetworkInfo mNetworkInfo;
- private DcNetworkAgent(DataConnection dc, String tag, Phone phone, NetworkInfo ni,
- int score, NetworkMisc misc, int factorySerialNumber,
- int transportType) {
- super(dc.getHandler().getLooper(), phone.getContext(), tag, ni,
+ DcNetworkAgent(DataConnection dc, Phone phone, NetworkInfo ni, int score, NetworkMisc misc,
+ int factorySerialNumber, int transportType) {
+ super(dc.getHandler().getLooper(), phone.getContext(), "DcNetworkAgent", ni,
dc.getNetworkCapabilities(), dc.getLinkProperties(), score, misc,
factorySerialNumber);
- mTag = tag;
+ mTag = "DcNetworkAgent" + "-" + netId;
mPhone = phone;
mNetworkCapabilities = dc.getNetworkCapabilities();
mTransportType = transportType;
mDataConnection = dc;
mNetworkInfo = ni;
- logd(tag + " created for data connection " + dc.getName());
+ logd(mTag + " created for data connection " + dc.getName());
}
/**
@@ -93,28 +89,6 @@
}
/**
- * Constructor
- *
- * @param dc The data connection owns this network agent.
- * @param phone The phone object.
- * @param ni Network info.
- * @param score Score of the data connection.
- * @param misc The miscellaneous information of the data connection.
- * @param factorySerialNumber Serial number of telephony network factory.
- * @param transportType The transport of the data connection.
- * @return The network agent
- */
- public static DcNetworkAgent createDcNetworkAgent(DataConnection dc, Phone phone,
- NetworkInfo ni, int score, NetworkMisc misc,
- int factorySerialNumber, int transportType) {
- // Use serial number only. Do not use transport type because it can be transferred to
- // a different transport.
- String tag = "DcNetworkAgent-" + sSerialNumber.incrementAndGet();
- return new DcNetworkAgent(dc, tag, phone, ni, score, misc, factorySerialNumber,
- transportType);
- }
-
- /**
* Set the data connection that owns this network agent.
*
* @param dc Data connection owning this network agent.
diff --git a/src/java/com/android/internal/telephony/dataconnection/TelephonyNetworkFactory.java b/src/java/com/android/internal/telephony/dataconnection/TelephonyNetworkFactory.java
index f391320..7f0c730 100644
--- a/src/java/com/android/internal/telephony/dataconnection/TelephonyNetworkFactory.java
+++ b/src/java/com/android/internal/telephony/dataconnection/TelephonyNetworkFactory.java
@@ -347,16 +347,16 @@
if (dcTracker != null) {
DataConnection dc = dcTracker.getDataConnectionByApnType(
ApnSetting.getApnTypeString(apnType));
- if (dc != null && (dc.isActive() || dc.isActivating())) {
+ if (dc != null && (dc.isActive())) {
Message onCompleteMsg = mInternalHandler.obtainMessage(
EVENT_DATA_HANDOVER_COMPLETED);
onCompleteMsg.getData().putParcelable(
DcTracker.DATA_COMPLETE_MSG_EXTRA_NETWORK_REQUEST, networkRequest);
mPendingHandovers.put(onCompleteMsg, handoverParams);
- // TODO: Need to handle the case that the request is there, but there is no
- // actual data connections established.
requestNetworkInternal(networkRequest, DcTracker.REQUEST_TYPE_HANDOVER,
targetTransport, onCompleteMsg);
+ log("Requested handover " + ApnSetting.getApnTypeString(apnType) + " to "
+ + AccessNetworkConstants.transportTypeToString(targetTransport));
handoverPending = true;
} else {
// Request is there, but no actual data connection. In this case, just move
diff --git a/src/java/com/android/internal/telephony/uicc/UiccProfile.java b/src/java/com/android/internal/telephony/uicc/UiccProfile.java
index d5a2f94..376977e 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccProfile.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccProfile.java
@@ -372,8 +372,8 @@
String ccName = config.getString(CarrierConfigManager.KEY_CARRIER_NAME_STRING);
String newCarrierName = null;
- String currSpn = getServiceProviderName();
- int nameSource = SubscriptionManager.NAME_SOURCE_SIM_SOURCE;
+ String currSpn = getServiceProviderName(); // Get the name from EF_SPN.
+ int nameSource = SubscriptionManager.NAME_SOURCE_SIM_SPN;
// If carrier config is priority, use it regardless - the preference
// and the name were both set by the carrier, so this is safe;
// otherwise, if the SPN is priority but we don't have one *and* we have
@@ -382,10 +382,18 @@
newCarrierName = ccName;
nameSource = SubscriptionManager.NAME_SOURCE_CARRIER;
} else if (TextUtils.isEmpty(currSpn)) {
- // currSpn is empty and could not get name from carrier config; get name from carrier id
+ // currSpn is empty and could not get name from carrier config; get name from PNN or
+ // carrier id
Phone phone = PhoneFactory.getPhone(mPhoneId);
if (phone != null) {
- newCarrierName = phone.getCarrierName();
+ String currPnn = phone.getPlmn(); // Get the name from EF_PNN.
+ if (!TextUtils.isEmpty(currPnn)) {
+ newCarrierName = currPnn;
+ nameSource = SubscriptionManager.NAME_SOURCE_SIM_PNN;
+ } else {
+ newCarrierName = phone.getCarrierName(); // Get the name from carrier id.
+ nameSource = SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE;
+ }
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java
index 75b3534..609b028 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/SubscriptionControllerTest.java
@@ -202,7 +202,7 @@
/* Setting */
String disName = "TESTING";
- int nameSource = SubscriptionManager.NAME_SOURCE_SIM_SOURCE;
+ int nameSource = SubscriptionManager.NAME_SOURCE_SIM_SPN;
mSubscriptionControllerUT.setDisplayNameUsingSrc(disName, subID, nameSource);
SubscriptionInfo subInfo = mSubscriptionControllerUT
.getActiveSubscriptionInfo(subID, mCallingPackage);
@@ -465,12 +465,12 @@
// Changing non-opportunistic sub1 shouldn't trigger callback.
mSubscriptionControllerUT.setDisplayNameUsingSrc("DisplayName", 1,
- SubscriptionManager.NAME_SOURCE_SIM_SOURCE);
+ SubscriptionManager.NAME_SOURCE_SIM_SPN);
verify(mTelephonyRegisteryMock, times(1))
.notifyOpportunisticSubscriptionInfoChanged();
mSubscriptionControllerUT.setDisplayNameUsingSrc("DisplayName", 2,
- SubscriptionManager.NAME_SOURCE_SIM_SOURCE);
+ SubscriptionManager.NAME_SOURCE_SIM_SPN);
verify(mTelephonyRegisteryMock, times(2))
.notifyOpportunisticSubscriptionInfoChanged();
}
@@ -1004,4 +1004,28 @@
mSubscriptionControllerUT.setAlwaysAllowMmsData(0, false);
verify(mDataEnabledSettings).setAlwaysAllowMmsData(eq(false));
}
+
+ @Test
+ @SmallTest
+ public void testNameSourcePriority() throws Exception {
+ assertTrue(mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_USER_INPUT)
+ > mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_CARRIER));
+
+ assertTrue(mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_CARRIER)
+ > mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_SIM_SPN));
+
+ assertTrue(mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_SIM_SPN)
+ > mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_SIM_PNN));
+
+ assertTrue(mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_SIM_PNN)
+ > mSubscriptionControllerUT.getNameSourcePriority(
+ SubscriptionManager.NAME_SOURCE_DEFAULT_SOURCE));
+ }
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/TelephonyNetworkFactoryTest.java b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/TelephonyNetworkFactoryTest.java
index 9250942..ad6e7ec 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/dataconnection/TelephonyNetworkFactoryTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/dataconnection/TelephonyNetworkFactoryTest.java
@@ -29,6 +29,7 @@
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import android.net.NetworkCapabilities;
@@ -57,6 +58,7 @@
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
+import org.mockito.Mockito;
import java.lang.reflect.Field;
import java.util.ArrayList;
@@ -72,6 +74,9 @@
@Mock
private RadioConfig mMockRadioConfig;
+ @Mock
+ private DataConnection mDataConnection;
+
private String mTestName = "";
private final ArrayList<NetworkRequest> mNetworkRequestList = new ArrayList<>();
@@ -346,4 +351,41 @@
h.sendMessage(h.obtainMessage(5, ar));
processAllMessages();
}
+
+ /**
+ * Test handover when the data connection is being connected.
+ */
+ @Test
+ @SmallTest
+ public void testHandoverActivatingData() throws Exception {
+ createMockedTelephonyComponents();
+ doReturn(0).when(mSubscriptionController).getSubIdUsingPhoneId(0);
+ mTelephonyNetworkFactoryUT.mInternalHandler.sendEmptyMessage(
+ TelephonyNetworkFactory.EVENT_SUBSCRIPTION_CHANGED);
+
+ activatePhoneInPhoneSwitcher(0, true);
+ makeDefaultInternetRequest();
+
+ makeSubSpecificMmsRequest(0);
+ processAllMessages();
+
+ Field f = TelephonyNetworkFactory.class.getDeclaredField("mInternalHandler");
+ f.setAccessible(true);
+ Handler h = (Handler) f.get(mTelephonyNetworkFactoryUT);
+
+ HandoverCallback handoverCallback = mock(HandoverCallback.class);
+ Mockito.reset(mDcTracker);
+ doReturn(mDataConnection).when(mDcTracker).getDataConnectionByApnType(anyString());
+ doReturn(false).when(mDataConnection).isActive();
+
+ HandoverParams hp = new HandoverParams(ApnSetting.TYPE_MMS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN, handoverCallback);
+ AsyncResult ar = new AsyncResult(null, hp, null);
+ h.sendMessage(h.obtainMessage(5, ar));
+ processAllMessages();
+
+ verify(mDcTracker, times(1)).releaseNetwork(any(), eq(1));
+ verify(mDcTracker, times(1)).requestNetwork(any(), eq(1), any());
+ }
+
}