Merge "Implement code for getting contact-default phone acct" am: eb496c3adb am: 0a573e00d3
am: 864834e5cb
Change-Id: I78493e6a8babbb0dec9bef9f8be72f77364ee5e0
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index cfcd95b..6489969 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -1544,6 +1544,9 @@
return CompletableFuture.completedFuture(Arrays.asList(targetPhoneAccountHandle));
}
}
+ if (accounts.isEmpty() || accounts.size() == 1) {
+ return CompletableFuture.completedFuture(accounts);
+ }
// Do the query for whether there's a preferred contact
final CompletableFuture<PhoneAccountHandle> userPreferredAccountForContact =
@@ -1553,8 +1556,17 @@
new CallerInfoLookupHelper.OnQueryCompleteListener() {
@Override
public void onCallerInfoQueryComplete(Uri handle, CallerInfo info) {
- // TODO: construct the acct handle from caller info
- userPreferredAccountForContact.complete(null);
+ if (info.preferredPhoneAccountComponent != null &&
+ info.preferredPhoneAccountId != null &&
+ !info.preferredPhoneAccountId.isEmpty()) {
+ PhoneAccountHandle contactDefaultHandle = new PhoneAccountHandle(
+ info.preferredPhoneAccountComponent,
+ info.preferredPhoneAccountId,
+ initiatingUser);
+ userPreferredAccountForContact.complete(contactDefaultHandle);
+ } else {
+ userPreferredAccountForContact.complete(null);
+ }
}
@Override
@@ -1567,9 +1579,6 @@
if (phoneAccountHandle != null) {
return Collections.singletonList(phoneAccountHandle);
}
- if (possibleAccounts.isEmpty() || possibleAccounts.size() == 1) {
- return possibleAccounts;
- }
// No preset account, check if default exists that supports the URI scheme for the
// handle and verify it can be used.
PhoneAccountHandle defaultPhoneAccountHandle =
diff --git a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
index fe4213f..d79ea33 100644
--- a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
@@ -35,8 +35,10 @@
import android.content.ComponentName;
import android.net.Uri;
import android.os.Bundle;
+import android.os.Process;
import android.os.SystemClock;
import android.telecom.Connection;
+import android.telecom.Log;
import android.telecom.PhoneAccount;
import android.telecom.PhoneAccountHandle;
import android.telecom.TelecomManager;
@@ -44,6 +46,8 @@
import android.telephony.TelephonyManager;
import android.test.suitebuilder.annotation.MediumTest;
import android.test.suitebuilder.annotation.SmallTest;
+
+import com.android.internal.telephony.CallerInfo;
import com.android.server.telecom.AsyncRingtonePlayer;
import com.android.server.telecom.Call;
import com.android.server.telecom.CallAudioManager;
@@ -95,7 +99,9 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
@RunWith(JUnit4.class)
public class CallsManagerTest extends TelecomTestCase {
@@ -122,6 +128,13 @@
.setIsEnabled(true)
.build();
private static final Uri TEST_ADDRESS = Uri.parse("tel:555-1212");
+ private static final Uri TEST_ADDRESS2 = Uri.parse("tel:555-1213");
+ private static final Uri TEST_ADDRESS3 = Uri.parse("tel:555-1214");
+ private static final Map<Uri, PhoneAccountHandle> CONTACT_PREFERRED_ACCOUNT =
+ new HashMap<Uri, PhoneAccountHandle>() {{
+ put(TEST_ADDRESS2, SIM_1_HANDLE);
+ put(TEST_ADDRESS3, SIM_2_HANDLE);
+ }};
private final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
@Mock private CallerInfoLookupHelper mCallerInfoLookupHelper;
@@ -272,7 +285,13 @@
doAnswer(invocation -> {
Uri handle = invocation.getArgument(0);
CallerInfoLookupHelper.OnQueryCompleteListener listener = invocation.getArgument(1);
- listener.onCallerInfoQueryComplete(handle, null);
+ CallerInfo info = new CallerInfo();
+ if (CONTACT_PREFERRED_ACCOUNT.get(handle) != null) {
+ PhoneAccountHandle pah = CONTACT_PREFERRED_ACCOUNT.get(handle);
+ info.preferredPhoneAccountComponent = pah.getComponentName();
+ info.preferredPhoneAccountId = pah.getId();
+ }
+ listener.onCallerInfoQueryComplete(handle, info);
return null;
}).when(mCallerInfoLookupHelper).startLookup(any(Uri.class),
any(CallerInfoLookupHelper.OnQueryCompleteListener.class));
@@ -414,6 +433,27 @@
}
/**
+ * Tests that we will use the provided target phone account if it exists.
+ * @throws Exception
+ */
+ @MediumTest
+ @Test
+ public void testUseContactSpecificAcct() throws Exception {
+ setupCallerInfoLookupHelper();
+ when(mPhoneAccountRegistrar.getOutgoingPhoneAccountForScheme(any(), any())).thenReturn(
+ null);
+ when(mPhoneAccountRegistrar.getCallCapablePhoneAccounts(any(), anyBoolean(),
+ any(), anyInt())).thenReturn(
+ new ArrayList<>(Arrays.asList(SIM_1_HANDLE, SIM_2_HANDLE)));
+
+ List<PhoneAccountHandle> accounts = mCallsManager.findOutgoingCallPhoneAccount(
+ null, TEST_ADDRESS2, false /* isVideo */, Process.myUserHandle()).get();
+
+ assertEquals(1, accounts.size());
+ assertTrue(accounts.contains(SIM_1_HANDLE));
+ }
+
+ /**
* Verifies that an active call will result in playing a DTMF tone when requested.
* @throws Exception
*/