Merge "Only unbind if bind() returned success"
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java b/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java
index ef5b0ca..a8145df 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataEnabledOverride.java
@@ -340,7 +340,10 @@
}
/**
- * Set allowing mobile data during voice call.
+ * Set allowing mobile data during voice call. This is used for allowing data on the non-default
+ * data SIM. When a voice call is placed on the non-default data SIM on DSDS devices, users will
+ * not be able to use mobile data. By calling this API, data will be temporarily enabled on the
+ * non-default data SIM during the life cycle of the voice call.
*
* @param allow {@code true} if allowing using data during voice call, {@code false} if
* disallowed.
diff --git a/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java b/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
index f8a5a81..8549e33 100644
--- a/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
+++ b/src/java/com/android/internal/telephony/dataconnection/DataEnabledSettings.java
@@ -264,16 +264,23 @@
}
/**
- * Set allowing mobile data during voice call.
+ * Set allowing mobile data during voice call. This is used for allowing data on the non-default
+ * data SIM. When a voice call is placed on the non-default data SIM on DSDS devices, users will
+ * not be able to use mobile data. By calling this API, data will be temporarily enabled on the
+ * non-default data SIM during the life cycle of the voice call.
*
* @param allow {@code true} if allowing using data during voice call, {@code false} if
* disallowed
*
- * @return {@code false} if the setting is changed.
+ * @return {@code true} if operation is successful. otherwise {@code false}.
*/
public synchronized boolean setAllowDataDuringVoiceCall(boolean allow) {
localLog("setAllowDataDuringVoiceCall", allow);
+ if (allow == isDataAllowedInVoiceCall()) {
+ return true;
+ }
mDataEnabledOverride.setDataAllowedInVoiceCall(allow);
+
boolean changed = SubscriptionController.getInstance()
.setDataEnabledOverrideRules(mPhone.getSubId(), mDataEnabledOverride.getRules());
if (changed) {
diff --git a/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java b/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java
index 73991b9..c6c40ea 100644
--- a/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/IsimUiccRecords.java
@@ -434,12 +434,20 @@
@UnsupportedAppUsage
@Override
protected void log(String s) {
- if (DBG) Rlog.d(LOG_TAG, "[ISIM] " + s);
+ if (mParentApp != null) {
+ Rlog.d(LOG_TAG, "[ISIM-" + mParentApp.getPhoneId() + "] " + s);
+ } else {
+ Rlog.d(LOG_TAG, "[ISIM] " + s);
+ }
}
@Override
protected void loge(String s) {
- if (DBG) Rlog.e(LOG_TAG, "[ISIM] " + s);
+ if (mParentApp != null) {
+ Rlog.e(LOG_TAG, "[ISIM-" + mParentApp.getPhoneId() + "] " + s);
+ } else {
+ Rlog.e(LOG_TAG, "[ISIM] " + s);
+ }
}
@Override
diff --git a/src/java/com/android/internal/telephony/uicc/RuimRecords.java b/src/java/com/android/internal/telephony/uicc/RuimRecords.java
index d08575f..9cdf0eb 100644
--- a/src/java/com/android/internal/telephony/uicc/RuimRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/RuimRecords.java
@@ -964,13 +964,21 @@
@UnsupportedAppUsage
@Override
protected void log(String s) {
- Rlog.d(LOG_TAG, "[RuimRecords] " + s);
+ if (mParentApp != null) {
+ Rlog.d(LOG_TAG, "[RuimRecords-" + mParentApp.getPhoneId() + "] " + s);
+ } else {
+ Rlog.d(LOG_TAG, "[RuimRecords] " + s);
+ }
}
@UnsupportedAppUsage
@Override
protected void loge(String s) {
- Rlog.e(LOG_TAG, "[RuimRecords] " + s);
+ if (mParentApp != null) {
+ Rlog.e(LOG_TAG, "[RuimRecords-" + mParentApp.getPhoneId() + "] " + s);
+ } else {
+ Rlog.e(LOG_TAG, "[RuimRecords] " + s);
+ }
}
@Override
diff --git a/src/java/com/android/internal/telephony/uicc/SIMRecords.java b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
index 8839e04..cbdd320 100644
--- a/src/java/com/android/internal/telephony/uicc/SIMRecords.java
+++ b/src/java/com/android/internal/telephony/uicc/SIMRecords.java
@@ -1926,22 +1926,38 @@
@UnsupportedAppUsage
@Override
protected void log(String s) {
- Rlog.d(LOG_TAG, "[SIMRecords] " + s);
+ if (mParentApp != null) {
+ Rlog.d(LOG_TAG, "[SIMRecords-" + mParentApp.getPhoneId() + "] " + s);
+ } else {
+ Rlog.d(LOG_TAG, "[SIMRecords] " + s);
+ }
}
@UnsupportedAppUsage
@Override
protected void loge(String s) {
- Rlog.e(LOG_TAG, "[SIMRecords] " + s);
+ if (mParentApp != null) {
+ Rlog.e(LOG_TAG, "[SIMRecords-" + mParentApp.getPhoneId() + "] " + s);
+ } else {
+ Rlog.e(LOG_TAG, "[SIMRecords] " + s);
+ }
}
protected void logw(String s, Throwable tr) {
- Rlog.w(LOG_TAG, "[SIMRecords] " + s, tr);
+ if (mParentApp != null) {
+ Rlog.w(LOG_TAG, "[SIMRecords-" + mParentApp.getPhoneId() + "] " + s, tr);
+ } else {
+ Rlog.w(LOG_TAG, "[SIMRecords] " + s, tr);
+ }
}
@UnsupportedAppUsage
protected void logv(String s) {
- Rlog.v(LOG_TAG, "[SIMRecords] " + s);
+ if (mParentApp != null) {
+ Rlog.v(LOG_TAG, "[SIMRecords-" + mParentApp.getPhoneId() + "] " + s);
+ } else {
+ Rlog.v(LOG_TAG, "[SIMRecords] " + s);
+ }
}
/**
diff --git a/src/java/com/android/internal/telephony/uicc/UiccController.java b/src/java/com/android/internal/telephony/uicc/UiccController.java
index b3f6f79..a00a364 100644
--- a/src/java/com/android/internal/telephony/uicc/UiccController.java
+++ b/src/java/com/android/internal/telephony/uicc/UiccController.java
@@ -696,17 +696,32 @@
cardString = card.getIccId();
}
- // EID may be unpopulated if RadioConfig<1.2
- // If so, just register for EID loaded and skip this stuff
- if (isEuicc && cardString == null
- && mDefaultEuiccCardId != UNSUPPORTED_CARD_ID) {
- ((EuiccCard) card).registerForEidReady(this, EVENT_EID_READY, index);
- }
-
if (cardString != null) {
addCardId(cardString);
}
+ // EID is unpopulated if Radio HAL < 1.4 (RadioConfig < 1.2)
+ // If so, just register for EID loaded and skip this stuff
+ if (isEuicc && mDefaultEuiccCardId != UNSUPPORTED_CARD_ID) {
+ if (cardString == null) {
+ ((EuiccCard) card).registerForEidReady(this, EVENT_EID_READY, index);
+ } else {
+ // If we know the EID from IccCardStatus, just use it to set mDefaultEuiccCardId if
+ // it's not already set.
+ // This is needed in cases where slot status doesn't include EID, and we don't want
+ // to register for EID from APDU because we already know cardString from a previous
+ // APDU
+ if (mDefaultEuiccCardId == UNINITIALIZED_CARD_ID
+ || mDefaultEuiccCardId == TEMPORARILY_UNSUPPORTED_CARD_ID) {
+ mDefaultEuiccCardId = convertToPublicCardId(cardString);
+ String logStr = "IccCardStatus eid=" + cardString + " slot=" + slotId
+ + " mDefaultEuiccCardId=" + mDefaultEuiccCardId;
+ sLocalLog.log(logStr);
+ log(logStr);
+ }
+ }
+ }
+
if (DBG) log("Notifying IccChangedRegistrants");
mIccChangedRegistrants.notifyRegistrants(new AsyncResult(null, index, null));
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccControllerTest.java
index 336267c..e518f3e 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/uicc/UiccControllerTest.java
@@ -593,4 +593,42 @@
assertEquals(mUiccControllerUT.convertToPublicCardId(eidForRemovableEuicc),
mUiccControllerUT.getCardIdForDefaultEuicc());
}
+
+ /**
+ * When IccCardStatus is received, if the EID is known from previous APDU, use it to set the
+ * mDefaultEuiccCardId.
+ */
+ @Test
+ public void testEidFromPreviousApduSetsDefaultEuicc() {
+ // Give UiccController a real context so it can use shared preferences
+ mUiccControllerUT.mContext = InstrumentationRegistry.getContext();
+
+ // Mock out UiccSlots
+ mUiccControllerUT.mUiccSlots[0] = mMockSlot;
+ doReturn(true).when(mMockSlot).isEuicc();
+ doReturn(null).when(mMockSlot).getUiccCard();
+ doReturn("123451234567890").when(mMockSlot).getIccId();
+ doReturn(false).when(mMockSlot).isRemovable();
+
+ // If APDU has already happened, the EuiccCard already knows EID
+ String knownEidFromApdu = "A1B2C3D4E5";
+ doReturn(mMockEuiccCard).when(mMockSlot).getUiccCard();
+ doReturn(knownEidFromApdu).when(mMockEuiccCard).getEid();
+
+ // simulate card status loaded so that the UiccController sets the card ID
+ IccCardStatus ics = new IccCardStatus();
+ ics.setCardState(1 /* present */);
+ ics.setUniversalPinState(3 /* disabled */);
+ ics.atr = "abcdef0123456789abcdef";
+ ics.iccid = "123451234567890";
+ // the IccCardStatus does not contain EID, but it is known from previous APDU
+ ics.eid = null;
+ AsyncResult ar = new AsyncResult(null, ics, null);
+ Message msg = Message.obtain(mUiccControllerUT, EVENT_GET_ICC_STATUS_DONE, ar);
+ mUiccControllerUT.handleMessage(msg);
+
+ // since EID is known and we've gotten card status, the default eUICC card ID should be set
+ assertEquals(mUiccControllerUT.convertToPublicCardId(knownEidFromApdu),
+ mUiccControllerUT.getCardIdForDefaultEuicc());
+ }
}