Merge "Send identifier disclosure events to safety center" into main
diff --git a/src/java/com/android/internal/telephony/SimResponse.java b/src/java/com/android/internal/telephony/SimResponse.java
index 164ec7d..59defc3 100644
--- a/src/java/com/android/internal/telephony/SimResponse.java
+++ b/src/java/com/android/internal/telephony/SimResponse.java
@@ -112,6 +112,8 @@
android.hardware.radio.sim.CarrierRestrictions carrierRestrictions,
int multiSimPolicy) {
RILRequest rr = mRil.processResponse(HAL_SERVICE_SIM, responseInfo);
+ boolean carrierLockInfoSupported = mRil.getHalVersion(HAL_SERVICE_SIM).greater(
+ RIL.RADIO_HAL_VERSION_2_2);
if (rr == null) {
return;
}
@@ -132,7 +134,8 @@
RILUtils.convertAidlCarrierInfoList(
carrierRestrictions.allowedCarrierInfoList)).setExcludedCarrierInfo(
RILUtils.convertAidlCarrierInfoList(
- carrierRestrictions.excludedCarrierInfoList)).build();
+ carrierRestrictions.excludedCarrierInfoList)).setCarrierLockInfoFeature(
+ carrierLockInfoSupported).build();
if (responseInfo.error == RadioError.NONE) {
RadioResponse.sendMessageResponse(rr.mResult, ret);
}
diff --git a/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java b/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java
index c66aebc..40adc7c 100644
--- a/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/DomainSelectionConnection.java
@@ -66,6 +66,8 @@
protected static final int EVENT_QUALIFIED_NETWORKS_CHANGED = 2;
protected static final int EVENT_SERVICE_CONNECTED = 3;
protected static final int EVENT_SERVICE_BINDING_TIMEOUT = 4;
+ protected static final int EVENT_RESET_NETWORK_SCAN_DONE = 5;
+ protected static final int EVENT_LAST = EVENT_RESET_NETWORK_SCAN_DONE;
private static final int DEFAULT_BIND_RETRY_TIMEOUT_MS = 4 * 1000;
@@ -73,6 +75,7 @@
private static final int STATUS_DOMAIN_SELECTED = 1 << 1;
private static final int STATUS_WAIT_BINDING = 1 << 2;
private static final int STATUS_WAIT_SCAN_RESULT = 1 << 3;
+ private static final int STATUS_WAIT_RESET_SCAN_RESULT = 1 << 4;
/** Callback to receive responses from DomainSelectionConnection. */
public interface DomainSelectionConnectionCallback {
@@ -85,6 +88,16 @@
void onSelectionTerminated(@DisconnectCauses int cause);
}
+ private static class ScanRequest {
+ final int[] mPreferredNetworks;
+ final int mScanType;
+
+ ScanRequest(int[] preferredNetworks, int scanType) {
+ mPreferredNetworks = preferredNetworks;
+ mScanType = scanType;
+ }
+ }
+
/**
* A wrapper class for {@link ITransportSelectorCallback} interface.
*/
@@ -95,7 +108,7 @@
mDomainSelector = selector;
if (checkState(STATUS_DISPOSED)) {
try {
- selector.cancelSelection();
+ selector.finishSelection();
} catch (RemoteException e) {
// ignore exception
}
@@ -117,20 +130,6 @@
}
@Override
- public @NonNull IWwanSelectorCallback onWwanSelected() {
- synchronized (mLock) {
- if (mWwanSelectorCallback == null) {
- mWwanSelectorCallback = new WwanSelectorCallbackAdaptor();
- }
- if (checkState(STATUS_DISPOSED)) {
- return mWwanSelectorCallback;
- }
- DomainSelectionConnection.this.onWwanSelected();
- return mWwanSelectorCallback;
- }
- }
-
- @Override
public void onWwanSelectedAsync(@NonNull final ITransportSelectorResultCallback cb) {
synchronized (mLock) {
if (checkState(STATUS_DISPOSED)) {
@@ -180,7 +179,8 @@
@Override
public void onRequestEmergencyNetworkScan(
@NonNull @RadioAccessNetworkType int[] preferredNetworks,
- @EmergencyScanType int scanType, @NonNull IWwanSelectorResultCallback cb) {
+ @EmergencyScanType int scanType, boolean resetScan,
+ @NonNull IWwanSelectorResultCallback cb) {
synchronized (mLock) {
if (checkState(STATUS_DISPOSED)) {
return;
@@ -190,7 +190,7 @@
mHandler.post(() -> {
synchronized (mLock) {
DomainSelectionConnection.this.onRequestEmergencyNetworkScan(
- preferredNetworks, scanType);
+ preferredNetworks, scanType, resetScan);
}
});
}
@@ -275,6 +275,17 @@
}
}
break;
+ case EVENT_RESET_NETWORK_SCAN_DONE:
+ synchronized (mLock) {
+ clearState(STATUS_WAIT_RESET_SCAN_RESULT);
+ if (checkState(STATUS_DISPOSED)
+ || (mPendingScanRequest == null)) {
+ return;
+ }
+ onRequestEmergencyNetworkScan(mPendingScanRequest.mPreferredNetworks,
+ mPendingScanRequest.mScanType, false);
+ }
+ break;
default:
loge("handleMessage unexpected msg=" + msg.what);
break;
@@ -320,6 +331,8 @@
private @NonNull AndroidFuture<Integer> mOnComplete;
+ private @Nullable ScanRequest mPendingScanRequest;
+
/**
* Creates an instance.
*
@@ -449,10 +462,11 @@
*
* @param preferredNetworks The ordered list of preferred networks to scan.
* @param scanType Indicates the scan preference, such as full service or limited service.
+ * @param resetScan Indicates that the previous scan result shall be reset before scanning.
*/
public void onRequestEmergencyNetworkScan(
@NonNull @RadioAccessNetworkType int[] preferredNetworks,
- @EmergencyScanType int scanType) {
+ @EmergencyScanType int scanType, boolean resetScan) {
// Can be overridden if required
synchronized (mLock) {
@@ -464,6 +478,29 @@
return;
}
+ if (checkState(STATUS_WAIT_RESET_SCAN_RESULT)) {
+ if (mPendingScanRequest != null) {
+ /* Consecutive scan requests without cancellation is not an expected use case.
+ * DomainSelector should cancel the previous request or wait for the result
+ * before requesting a new scan.*/
+ logi("onRequestEmergencyNetworkScan consecutive scan requests");
+ return;
+ } else {
+ // The reset has not been completed.
+ // case1) Long delay in cancelEmergencyNetworkScan by modem.
+ // case2) A consecutive scan requests with short interval from DomainSelector.
+ logi("onRequestEmergencyNetworkScan reset not completed");
+ }
+ mPendingScanRequest = new ScanRequest(preferredNetworks, scanType);
+ return;
+ } else if (resetScan) {
+ setState(STATUS_WAIT_RESET_SCAN_RESULT);
+ mPendingScanRequest = new ScanRequest(preferredNetworks, scanType);
+ mPhone.cancelEmergencyNetworkScan(resetScan,
+ mHandler.obtainMessage(EVENT_RESET_NETWORK_SCAN_DONE));
+ return;
+ }
+
if (!mRegisteredRegistrant) {
mPhone.registerForEmergencyNetworkScan(mHandler,
EVENT_EMERGENCY_NETWORK_SCAN_RESULT, null);
@@ -471,6 +508,7 @@
}
setState(STATUS_WAIT_SCAN_RESULT);
mPhone.triggerEmergencyNetworkScan(preferredNetworks, scanType, null);
+ mPendingScanRequest = null;
}
}
@@ -506,6 +544,7 @@
}
private void onCancel(boolean resetScan) {
+ mPendingScanRequest = null;
if (checkState(STATUS_WAIT_SCAN_RESULT)) {
clearState(STATUS_WAIT_SCAN_RESULT);
mPhone.cancelEmergencyNetworkScan(resetScan, null);
@@ -517,17 +556,7 @@
* to clean up all ongoing operations with the framework.
*/
public void cancelSelection() {
- synchronized (mLock) {
- try {
- if (mDomainSelector != null) {
- mDomainSelector.cancelSelection();
- }
- } catch (RemoteException e) {
- loge("cancelSelection exception=" + e);
- } finally {
- dispose();
- }
- }
+ finishSelection();
}
/**
diff --git a/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java b/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
index b64c7cb..58917bc 100644
--- a/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnection.java
@@ -28,6 +28,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.net.Uri;
+import android.telecom.PhoneAccount;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.Annotation.DisconnectCauses;
@@ -201,6 +203,7 @@
* @param exited {@code true} if the request caused the device to move out of airplane mode.
* @param callId The call identifier.
* @param number The dialed number.
+ * @param isTest Indicates it's a test emergency number.
* @param callFailCause The reason why the last CS attempt failed.
* @param imsReasonInfo The reason why the last PS attempt failed.
* @param emergencyRegResult The current registration result for emergency services.
@@ -208,16 +211,17 @@
*/
public static @NonNull DomainSelectionService.SelectionAttributes getSelectionAttributes(
int slotId, int subId, boolean exited,
- @NonNull String callId, @NonNull String number, int callFailCause,
- @Nullable ImsReasonInfo imsReasonInfo,
+ @NonNull String callId, @NonNull String number, boolean isTest,
+ int callFailCause, @Nullable ImsReasonInfo imsReasonInfo,
@Nullable EmergencyRegResult emergencyRegResult) {
DomainSelectionService.SelectionAttributes.Builder builder =
new DomainSelectionService.SelectionAttributes.Builder(
slotId, subId, SELECTOR_TYPE_CALLING)
.setEmergency(true)
+ .setTestEmergencyNumber(isTest)
.setExitedFromAirplaneMode(exited)
.setCallId(callId)
- .setNumber(number)
+ .setAddress(Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null))
.setCsDisconnectCause(callFailCause);
if (imsReasonInfo != null) builder.setPsDisconnectCause(imsReasonInfo);
@@ -233,11 +237,12 @@
if (attr == null) return null;
DomainSelectionService.SelectionAttributes.Builder builder =
new DomainSelectionService.SelectionAttributes.Builder(
- attr.getSlotId(), attr.getSubId(), SELECTOR_TYPE_CALLING)
+ attr.getSlotIndex(), attr.getSubscriptionId(), SELECTOR_TYPE_CALLING)
.setCallId(attr.getCallId())
- .setNumber(attr.getNumber())
+ .setAddress(attr.getAddress())
.setVideoCall(attr.isVideoCall())
.setEmergency(true)
+ .setTestEmergencyNumber(attr.isTestEmergencyNumber())
.setExitedFromAirplaneMode(attr.isExitedFromAirplaneMode())
.setEmergencyRegResult(new EmergencyRegResult(AccessNetworkType.UNKNOWN,
NetworkRegistrationInfo.REGISTRATION_STATE_UNKNOWN,
diff --git a/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java b/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java
index 0532a05..0fd9201 100644
--- a/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnection.java
@@ -20,6 +20,8 @@
import android.annotation.NonNull;
import android.annotation.Nullable;
+import android.net.Uri;
+import android.telecom.PhoneAccount;
import android.telephony.AccessNetworkConstants.RadioAccessNetworkType;
import android.telephony.Annotation.DisconnectCauses;
import android.telephony.DisconnectCause;
@@ -78,7 +80,7 @@
/** {@inheritDoc} */
@Override
public void onRequestEmergencyNetworkScan(@RadioAccessNetworkType int[] preferredNetworks,
- @EmergencyScanType int scanType) {
+ @EmergencyScanType int scanType, boolean resetScan) {
// Not expected with normal calling.
// Override to prevent abnormal behavior.
}
@@ -119,7 +121,7 @@
slotId, subId, SELECTOR_TYPE_CALLING)
.setEmergency(false)
.setCallId(callId)
- .setNumber(number)
+ .setAddress(Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null))
.setCsDisconnectCause(callFailCause)
.setVideoCall(isVideoCall);
diff --git a/src/java/com/android/internal/telephony/domainselection/SmsDomainSelectionConnection.java b/src/java/com/android/internal/telephony/domainselection/SmsDomainSelectionConnection.java
index 36a7b17..b3f4924 100644
--- a/src/java/com/android/internal/telephony/domainselection/SmsDomainSelectionConnection.java
+++ b/src/java/com/android/internal/telephony/domainselection/SmsDomainSelectionConnection.java
@@ -53,17 +53,6 @@
if (mCallback != null) mCallback.onSelectionTerminated(cause);
}
- @Override
- public void finishSelection() {
- CompletableFuture<Integer> future = getCompletableFuture();
-
- if (future != null && !future.isDone()) {
- cancelSelection();
- } else {
- super.finishSelection();
- }
- }
-
/**
* Requests a domain selection for SMS.
*
diff --git a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
index 9f3ec3b..2f1c2d6 100644
--- a/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
+++ b/src/java/com/android/internal/telephony/imsphone/ImsPhone.java
@@ -2832,6 +2832,15 @@
mCT.triggerNotifyAnbr(mediaType, direction, bitsPerSecond);
}
+ /**
+ * Check whether making a call using Wi-Fi is possible or not.
+ * @return {code true} if IMS is registered over IWLAN else return {code false}.
+ */
+ public boolean canMakeWifiCall() {
+ return isImsRegistered() && (getImsRegistrationTech()
+ == ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN);
+ }
+
@Override
public void dump(FileDescriptor fd, PrintWriter printWriter, String[] args) {
IndentingPrintWriter pw = new IndentingPrintWriter(printWriter, " ");
diff --git a/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java
index cd7aadc..f85bcbe 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/domainselection/DomainSelectionConnectionTest.java
@@ -27,15 +27,19 @@
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.anyBoolean;
import static org.mockito.Mockito.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
+import android.net.Uri;
import android.os.AsyncResult;
import android.os.Handler;
+import android.os.Message;
import android.os.RemoteException;
+import android.telecom.PhoneAccount;
import android.telephony.AccessNetworkConstants;
import android.telephony.AccessNetworkConstants.AccessNetworkType;
import android.telephony.DomainSelectionService;
@@ -171,7 +175,116 @@
IWwanSelectorResultCallback resultCallback =
Mockito.mock(IWwanSelectorResultCallback.class);
- wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType, resultCallback);
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ false, resultCallback);
+ processAllMessages();
+
+ ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
+ ArgumentCaptor<Integer> eventCaptor = ArgumentCaptor.forClass(Integer.class);
+
+ verify(mPhone).registerForEmergencyNetworkScan(
+ handlerCaptor.capture(), eventCaptor.capture(), any());
+
+ int[] expectedPreferredNetworks = new int[] { EUTRAN, UTRAN };
+
+ verify(mPhone).triggerEmergencyNetworkScan(eq(expectedPreferredNetworks),
+ eq(scanType), any());
+
+ Handler handler = handlerCaptor.getValue();
+ int event = eventCaptor.getValue();
+
+ assertNotNull(handler);
+
+ EmergencyRegResult regResult =
+ new EmergencyRegResult(UTRAN, 0, 0, true, false, 0, 0, "", "", "");
+ handler.sendMessage(handler.obtainMessage(event, new AsyncResult(null, regResult, null)));
+ processAllMessages();
+
+ verify(resultCallback).onComplete(eq(regResult));
+ verify(mPhone, times(0)).cancelEmergencyNetworkScan(anyBoolean(), any());
+ }
+
+ @Test
+ @SmallTest
+ public void testWwanSelectorCallbackOnRequestEmergencyNetworkScanAndCancel() throws Exception {
+ mDsc = createConnection(mPhone, SELECTOR_TYPE_CALLING, true,
+ mDomainSelectionController);
+
+ ITransportSelectorCallback transportCallback = mDsc.getTransportSelectorCallback();
+
+ assertNotNull(transportCallback);
+
+ DomainSelectionService.SelectionAttributes attr = getSelectionAttributes(
+ mPhone.getPhoneId(), mPhone.getSubId(), SELECTOR_TYPE_CALLING, true,
+ false, 0, null, null, null, null);
+
+ mDsc.selectDomain(attr);
+
+ IDomainSelector domainSelector = Mockito.mock(IDomainSelector.class);
+ transportCallback.onCreated(domainSelector);
+
+ IWwanSelectorCallback wwanCallback = onWwanSelected(transportCallback);
+
+ assertNotNull(wwanCallback);
+
+ wwanCallback.onRequestEmergencyNetworkScan(new int[] { }, SCAN_TYPE_NO_PREFERENCE,
+ false, Mockito.mock(IWwanSelectorResultCallback.class));
+ processAllMessages();
+
+ verify(mPhone).registerForEmergencyNetworkScan(any(), anyInt(), any());
+ verify(mPhone).triggerEmergencyNetworkScan(any(), anyInt(), any());
+
+ wwanCallback.onCancel();
+ processAllMessages();
+
+ verify(mPhone).cancelEmergencyNetworkScan(eq(false), any());
+ }
+
+ @Test
+ public void testWwanSelectorCallbackOnRequestEmergencyNetworkScanWithResetScan()
+ throws Exception {
+ mDsc = createConnection(mPhone, SELECTOR_TYPE_CALLING, true,
+ mDomainSelectionController);
+
+ ITransportSelectorCallback transportCallback = mDsc.getTransportSelectorCallback();
+
+ assertNotNull(transportCallback);
+
+ DomainSelectionService.SelectionAttributes attr = getSelectionAttributes(
+ mPhone.getPhoneId(), mPhone.getSubId(), SELECTOR_TYPE_CALLING, true,
+ false, 0, TELECOM_CALL_ID1, null, null, null);
+
+ mDsc.selectDomain(attr);
+
+ IDomainSelector domainSelector = Mockito.mock(IDomainSelector.class);
+ transportCallback.onCreated(domainSelector);
+
+ IWwanSelectorCallback wwanCallback = onWwanSelected(transportCallback);
+
+ assertNotNull(wwanCallback);
+
+ int[] preferredNetworks = new int[] { EUTRAN, UTRAN };
+ int scanType = SCAN_TYPE_NO_PREFERENCE;
+ IWwanSelectorResultCallback resultCallback =
+ Mockito.mock(IWwanSelectorResultCallback.class);
+
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ true, resultCallback);
+ processAllMessages();
+
+ ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);
+
+ verify(mPhone).cancelEmergencyNetworkScan(eq(true), msgCaptor.capture());
+
+ verify(mPhone, times(0)).registerForEmergencyNetworkScan(any(), anyInt(), any());
+ verify(mPhone, times(0)).triggerEmergencyNetworkScan(any(), anyInt(), any());
+
+ Message msg = msgCaptor.getValue();
+
+ assertNotNull(msg);
+
+ AsyncResult unused = AsyncResult.forMessage(msg);
+ msg.sendToTarget();
processAllMessages();
ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -199,8 +312,8 @@
}
@Test
- @SmallTest
- public void testWwanSelectorCallbackOnRequestEmergencyNetworkScanAndCancel() throws Exception {
+ public void testWwanSelectorCallbackOnRequestEmergencyNetworkScanWithResetScanDoneAndCancel()
+ throws Exception {
mDsc = createConnection(mPhone, SELECTOR_TYPE_CALLING, true,
mDomainSelectionController);
@@ -210,7 +323,7 @@
DomainSelectionService.SelectionAttributes attr = getSelectionAttributes(
mPhone.getPhoneId(), mPhone.getSubId(), SELECTOR_TYPE_CALLING, true,
- false, 0, null, null, null, null);
+ false, 0, TELECOM_CALL_ID1, null, null, null);
mDsc.selectDomain(attr);
@@ -221,17 +334,100 @@
assertNotNull(wwanCallback);
- wwanCallback.onRequestEmergencyNetworkScan(new int[] { },
- SCAN_TYPE_NO_PREFERENCE, Mockito.mock(IWwanSelectorResultCallback.class));
+ int[] preferredNetworks = new int[] { EUTRAN, UTRAN };
+ int scanType = SCAN_TYPE_NO_PREFERENCE;
+ IWwanSelectorResultCallback resultCallback =
+ Mockito.mock(IWwanSelectorResultCallback.class);
+
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ true, resultCallback);
processAllMessages();
+ ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);
+
+ verify(mPhone).cancelEmergencyNetworkScan(eq(true), msgCaptor.capture());
+ verify(mPhone, times(0)).registerForEmergencyNetworkScan(any(), anyInt(), any());
+ verify(mPhone, times(0)).triggerEmergencyNetworkScan(any(), anyInt(), any());
+
+ Message msg = msgCaptor.getValue();
+
+ assertNotNull(msg);
+
+ // Reset completes.
+ AsyncResult unused = AsyncResult.forMessage(msg);
+ msg.sendToTarget();
+ processAllMessages();
+
+ // Verify that scan is requested.
verify(mPhone).registerForEmergencyNetworkScan(any(), anyInt(), any());
verify(mPhone).triggerEmergencyNetworkScan(any(), anyInt(), any());
+ // Cancele scan after reset completes.
wwanCallback.onCancel();
processAllMessages();
+ // Verify scan request is canceled.
verify(mPhone).cancelEmergencyNetworkScan(eq(false), any());
+ verify(mPhone, times(2)).cancelEmergencyNetworkScan(anyBoolean(), any());
+ }
+
+ @Test
+ public void testWwanSelectorCallbackOnRequestEmergencyNetworkScanWithResetScanAndCancel()
+ throws Exception {
+ mDsc = createConnection(mPhone, SELECTOR_TYPE_CALLING, true,
+ mDomainSelectionController);
+
+ ITransportSelectorCallback transportCallback = mDsc.getTransportSelectorCallback();
+
+ assertNotNull(transportCallback);
+
+ DomainSelectionService.SelectionAttributes attr = getSelectionAttributes(
+ mPhone.getPhoneId(), mPhone.getSubId(), SELECTOR_TYPE_CALLING, true,
+ false, 0, TELECOM_CALL_ID1, null, null, null);
+
+ mDsc.selectDomain(attr);
+
+ IDomainSelector domainSelector = Mockito.mock(IDomainSelector.class);
+ transportCallback.onCreated(domainSelector);
+
+ IWwanSelectorCallback wwanCallback = onWwanSelected(transportCallback);
+
+ assertNotNull(wwanCallback);
+
+ int[] preferredNetworks = new int[] { EUTRAN, UTRAN };
+ int scanType = SCAN_TYPE_NO_PREFERENCE;
+ IWwanSelectorResultCallback resultCallback =
+ Mockito.mock(IWwanSelectorResultCallback.class);
+
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ true, resultCallback);
+ processAllMessages();
+
+ ArgumentCaptor<Message> msgCaptor = ArgumentCaptor.forClass(Message.class);
+
+ verify(mPhone).cancelEmergencyNetworkScan(eq(true), msgCaptor.capture());
+ verify(mPhone, times(0)).registerForEmergencyNetworkScan(any(), anyInt(), any());
+ verify(mPhone, times(0)).triggerEmergencyNetworkScan(any(), anyInt(), any());
+
+ Message msg = msgCaptor.getValue();
+
+ assertNotNull(msg);
+
+ // Canceled before reset completes.
+ wwanCallback.onCancel();
+ processAllMessages();
+
+ // Verify there is no additional cancel.
+ verify(mPhone, times(1)).cancelEmergencyNetworkScan(anyBoolean(), any());
+
+ // Reset completes
+ AsyncResult unused = AsyncResult.forMessage(msg);
+ msg.sendToTarget();
+ processAllMessages();
+
+ // Verify there is no scan request after reset completes.
+ verify(mPhone, times(0)).registerForEmergencyNetworkScan(any(), anyInt(), any());
+ verify(mPhone, times(0)).triggerEmergencyNetworkScan(any(), anyInt(), any());
}
@Test
@@ -255,7 +451,7 @@
mDsc.cancelSelection();
- verify(domainSelector).cancelSelection();
+ verify(domainSelector).finishSelection();
}
@Test
@@ -393,7 +589,8 @@
Mockito.mock(IWwanSelectorResultCallback.class);
// 1st scan request from remote service
- wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType, resultCallback);
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ false, resultCallback);
processAllMessages();
ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -429,7 +626,8 @@
// 2nd scan request
IWwanSelectorResultCallback resultCallback2 =
Mockito.mock(IWwanSelectorResultCallback.class);
- wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType, resultCallback2);
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ false, resultCallback2);
processAllMessages();
// Verify that triggerEmergencyNetworkScan isn't called
@@ -476,7 +674,8 @@
Mockito.mock(IWwanSelectorResultCallback.class);
// 1st scan request from remote service
- wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType, resultCallback);
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ false, resultCallback);
processAllMessages();
ArgumentCaptor<Handler> handlerCaptor = ArgumentCaptor.forClass(Handler.class);
@@ -517,7 +716,8 @@
// 2nd scan request
IWwanSelectorResultCallback resultCallback2 =
Mockito.mock(IWwanSelectorResultCallback.class);
- wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType, resultCallback2);
+ wwanCallback.onRequestEmergencyNetworkScan(preferredNetworks, scanType,
+ false, resultCallback2);
processAllMessages();
// Verify that triggerEmergencyNetworkScan is called
@@ -594,7 +794,9 @@
.setCsDisconnectCause(callFailCause);
if (callId != null) builder.setCallId(callId);
- if (number != null) builder.setNumber(number);
+ if (number != null) {
+ builder.setAddress(Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null));
+ }
if (imsReasonInfo != null) builder.setPsDisconnectCause(imsReasonInfo);
if (regResult != null) builder.setEmergencyRegResult(regResult);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnectionTest.java
index 76de9c9..7797b9b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencyCallDomainSelectionConnectionTest.java
@@ -121,7 +121,7 @@
DomainSelectionService.SelectionAttributes attr =
EmergencyCallDomainSelectionConnection.getSelectionAttributes(
mPhone.getPhoneId(), mPhone.getSubId(), false,
- TELECOM_CALL_ID1, "911", 0, null, regResult);
+ TELECOM_CALL_ID1, "911", false, 0, null, regResult);
CompletableFuture<Integer> future =
mEcDsc.createEmergencyConnection(attr, mConnectionCallback);
@@ -170,7 +170,7 @@
DomainSelectionService.SelectionAttributes attr =
EmergencyCallDomainSelectionConnection.getSelectionAttributes(
mPhone.getPhoneId(), mPhone.getSubId(), false,
- TELECOM_CALL_ID1, "911", 0, null, regResult);
+ TELECOM_CALL_ID1, "911", false, 0, null, regResult);
CompletableFuture<Integer> future =
mEcDsc.createEmergencyConnection(attr, mConnectionCallback);
@@ -208,7 +208,7 @@
DomainSelectionService.SelectionAttributes attr =
EmergencyCallDomainSelectionConnection.getSelectionAttributes(
mPhone.getPhoneId(), mPhone.getSubId(), false,
- TELECOM_CALL_ID1, "911", 0, null, regResult);
+ TELECOM_CALL_ID1, "911", false, 0, null, regResult);
CompletableFuture<Integer> future =
mEcDsc.createEmergencyConnection(attr, mConnectionCallback);
@@ -242,7 +242,7 @@
DomainSelectionService.SelectionAttributes attr =
EmergencyCallDomainSelectionConnection.getSelectionAttributes(
mPhone.getPhoneId(), mPhone.getSubId(), false,
- TELECOM_CALL_ID1, "911", 0, null, regResult);
+ TELECOM_CALL_ID1, "911", false, 0, null, regResult);
mEcDsc.createEmergencyConnection(attr, mConnectionCallback);
mTransportCallback.onSelectionTerminated(ERROR_UNSPECIFIED);
diff --git a/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencySmsDomainSelectionConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencySmsDomainSelectionConnectionTest.java
index c25aeb9..4f63be0 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencySmsDomainSelectionConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/domainselection/EmergencySmsDomainSelectionConnectionTest.java
@@ -444,7 +444,7 @@
assertFalse(future.isDone());
verify(mAnm).unregisterForQualifiedNetworksChanged(any(Handler.class));
- verify(mDomainSelector).cancelSelection();
+ verify(mDomainSelector).finishSelection();
}
@Test
diff --git a/tests/telephonytests/src/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnectionTest.java
index f05943f..72d8524 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/domainselection/NormalCallDomainSelectionConnectionTest.java
@@ -188,10 +188,10 @@
NormalCallDomainSelectionConnection.getSelectionAttributes(1, 2,
TELECOM_CALL_ID1, "123", false, 10, imsReasonInfo);
- assertEquals(1, attributes.getSlotId());
- assertEquals(2, attributes.getSubId());
+ assertEquals(1, attributes.getSlotIndex());
+ assertEquals(2, attributes.getSubscriptionId());
assertEquals(TELECOM_CALL_ID1, attributes.getCallId());
- assertEquals("123", attributes.getNumber());
+ assertEquals("123", attributes.getAddress().getSchemeSpecificPart());
assertEquals(false, attributes.isVideoCall());
assertEquals(false, attributes.isEmergency());
assertEquals(SELECTOR_TYPE_CALLING, attributes.getSelectorType());
diff --git a/tests/telephonytests/src/com/android/internal/telephony/domainselection/SmsDomainSelectionConnectionTest.java b/tests/telephonytests/src/com/android/internal/telephony/domainselection/SmsDomainSelectionConnectionTest.java
index 05291e2..5799dd8 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/domainselection/SmsDomainSelectionConnectionTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/domainselection/SmsDomainSelectionConnectionTest.java
@@ -205,7 +205,7 @@
mDsConnection.finishSelection();
- verify(mDomainSelector).cancelSelection();
+ verify(mDomainSelector).finishSelection();
}
private void setUpTestableLooper() throws Exception {
diff --git a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
index 6496efb..14cff4b 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/imsphone/ImsPhoneTest.java
@@ -1603,6 +1603,17 @@
assertEquals(2, copiedDialArgs.eccCategory);
}
+ @Test
+ @SmallTest
+ public void testCanMakeWifiCall() {
+ mImsPhoneUT.setServiceState(ServiceState.STATE_IN_SERVICE);
+ mImsPhoneUT.setImsRegistered(true);
+ doReturn(ImsRegistrationImplBase.REGISTRATION_TECH_IWLAN).when(mImsCT)
+ .getImsRegistrationTech();
+
+ assertTrue(mImsPhoneUT.canMakeWifiCall());
+ }
+
private ServiceState getServiceStateDataAndVoice(int rat, int regState, boolean isRoaming) {
ServiceState ss = new ServiceState();
ss.setStateOutOfService();