diff --git a/core/proto/android/companion/telecom.proto b/core/proto/android/companion/telecom.proto index 7fe2467032cbb..73dd8dd23bf5e 100644 --- a/core/proto/android/companion/telecom.proto +++ b/core/proto/android/companion/telecom.proto @@ -88,6 +88,8 @@ message Telecom { string name = 1; // Unique identifier for this facilitator, such as a package name. string identifier = 2; + // Extended identifier for this facilitator. + string extended_identifier = 3; } enum Control { diff --git a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncConnectionService.java b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncConnectionService.java index fac1c89810612..3187de548ea73 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncConnectionService.java +++ b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncConnectionService.java @@ -175,7 +175,8 @@ public class CallMetadataSyncConnectionService extends ConnectionService { : handle.getComponentName().getShortClassName(), phoneAccount != null ? phoneAccount.getExtras().getString( CrossDeviceSyncController.EXTRA_CALL_FACILITATOR_ID) - : handle.getComponentName().getPackageName()); + : handle.getComponentName().getPackageName(), + handle.getComponentName().flattenToString()); call.setFacilitator(callFacilitator); call.setDirection(android.companion.Telecom.Call.OUTGOING); call.setCallerId(connectionRequest.getAddress().getSchemeSpecificPart()); diff --git a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncData.java b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncData.java index 74641a48c4dd1..08811ba30d8d0 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncData.java +++ b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncData.java @@ -75,13 +75,15 @@ class CallMetadataSyncData { public static class CallFacilitator { private String mName; private String mIdentifier; + private String mExtendedIdentifier; private boolean mIsTel; CallFacilitator() {} - CallFacilitator(String name, String identifier) { + CallFacilitator(String name, String identifier, String extendedIdentifier) { mName = name; mIdentifier = identifier; + mExtendedIdentifier = extendedIdentifier; } public String getName() { @@ -92,6 +94,10 @@ class CallMetadataSyncData { return mIdentifier; } + public String getExtendedIdentifier() { + return mExtendedIdentifier; + } + public boolean isTel() { return mIsTel; } @@ -104,6 +110,10 @@ class CallMetadataSyncData { mIdentifier = identifier; } + public void setExtendedIdentifier(String extendedIdentifier) { + mExtendedIdentifier = extendedIdentifier; + } + public void setIsTel(boolean isTel) { mIsTel = isTel; } @@ -170,6 +180,8 @@ class CallMetadataSyncData { "com.android.server.companion.datatransfer.contextsync.extra.FACILITATOR_NAME"; private static final String EXTRA_FACILITATOR_ID = "com.android.server.companion.datatransfer.contextsync.extra.FACILITATOR_ID"; + private static final String EXTRA_FACILITATOR_EXT_ID = + "com.android.server.companion.datatransfer.contextsync.extra.FACILITATOR_EXT_ID"; private static final String EXTRA_STATUS = "com.android.server.companion.datatransfer.contextsync.extra.STATUS"; private static final String EXTRA_DIRECTION = @@ -192,7 +204,10 @@ class CallMetadataSyncData { call.setAppIcon(bundle.getByteArray(EXTRA_APP_ICON)); final String facilitatorName = bundle.getString(EXTRA_FACILITATOR_NAME); final String facilitatorIdentifier = bundle.getString(EXTRA_FACILITATOR_ID); - call.setFacilitator(new CallFacilitator(facilitatorName, facilitatorIdentifier)); + final String facilitatorExtendedIdentifier = + bundle.getString(EXTRA_FACILITATOR_EXT_ID); + call.setFacilitator(new CallFacilitator(facilitatorName, facilitatorIdentifier, + facilitatorExtendedIdentifier)); call.setStatus(bundle.getInt(EXTRA_STATUS)); call.setDirection(bundle.getInt(EXTRA_DIRECTION)); call.setControls(new HashSet<>(bundle.getIntegerArrayList(EXTRA_CONTROLS))); @@ -207,6 +222,7 @@ class CallMetadataSyncData { bundle.putByteArray(EXTRA_APP_ICON, mAppIcon); bundle.putString(EXTRA_FACILITATOR_NAME, mFacilitator.getName()); bundle.putString(EXTRA_FACILITATOR_ID, mFacilitator.getIdentifier()); + bundle.putString(EXTRA_FACILITATOR_EXT_ID, mFacilitator.getExtendedIdentifier()); bundle.putInt(EXTRA_STATUS, mStatus); bundle.putInt(EXTRA_DIRECTION, mDirection); bundle.putIntegerArrayList(EXTRA_CONTROLS, new ArrayList<>(mControls)); diff --git a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java index e8392d29365e1..2a507990b0d50 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java +++ b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java @@ -48,6 +48,7 @@ public class CrossDeviceCall { private final int mUserId; @VisibleForTesting boolean mIsEnterprise; private final String mCallingAppPackageName; + private final String mSerializedPhoneAccountHandle; private String mCallingAppName; private byte[] mCallingAppIcon; private String mCallerDisplayName; @@ -89,6 +90,8 @@ public class CrossDeviceCall { .equals(handle.getComponentName()); mCallingAppPackageName = handle != null ? callDetails.getAccountHandle().getComponentName().getPackageName() : ""; + mSerializedPhoneAccountHandle = handle != null + ? handle.getId() + SEPARATOR + handle.getComponentName().flattenToString() : ""; mIsEnterprise = (callDetails.getCallProperties() & Call.Details.PROPERTY_ENTERPRISE_CALL) == Call.Details.PROPERTY_ENTERPRISE_CALL; final PackageManager packageManager = context.getPackageManager(); @@ -247,6 +250,10 @@ public class CrossDeviceCall { return mCallingAppPackageName; } + public String getSerializedPhoneAccountHandle() { + return mSerializedPhoneAccountHandle; + } + /** * Get a human-readable "caller id" to display as the origin of the call. * diff --git a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncController.java b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncController.java index 31694590a9304..9bd5af956a6ee 100644 --- a/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncController.java +++ b/services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncController.java @@ -280,7 +280,7 @@ public class CrossDeviceSyncController { mCallFacilitators.add( new CallMetadataSyncData.CallFacilitator( defaultOutgoingTelAccount.getLabel().toString(), - FACILITATOR_ID_SYSTEM)); + FACILITATOR_ID_SYSTEM, FACILITATOR_ID_SYSTEM)); } } } @@ -574,6 +574,10 @@ public class CrossDeviceSyncController { case (int) Telecom.CallFacilitator.IDENTIFIER: facilitator.setIdentifier(pis.readString(Telecom.CallFacilitator.IDENTIFIER)); break; + case (int) Telecom.CallFacilitator.EXTENDED_IDENTIFIER: + facilitator.setExtendedIdentifier( + pis.readString(Telecom.CallFacilitator.EXTENDED_IDENTIFIER)); + break; default: Slog.e(TAG, "Unhandled field in Facilitator:" + ProtoUtils.currentFieldToString(pis)); @@ -649,6 +653,8 @@ public class CrossDeviceSyncController { final long facilitatorToken = pos.start(Telecom.Call.Origin.FACILITATOR); pos.write(Telecom.CallFacilitator.NAME, call.getCallingAppName()); pos.write(Telecom.CallFacilitator.IDENTIFIER, call.getCallingAppPackageName()); + pos.write(Telecom.CallFacilitator.EXTENDED_IDENTIFIER, + call.getSerializedPhoneAccountHandle()); pos.end(facilitatorToken); pos.end(originToken); pos.write(Telecom.Call.STATUS, call.getStatus()); @@ -662,6 +668,8 @@ public class CrossDeviceSyncController { final long facilitatorsToken = pos.start(Telecom.FACILITATORS); pos.write(Telecom.CallFacilitator.NAME, facilitator.getName()); pos.write(Telecom.CallFacilitator.IDENTIFIER, facilitator.getIdentifier()); + pos.write(Telecom.CallFacilitator.EXTENDED_IDENTIFIER, + facilitator.getExtendedIdentifier()); pos.end(facilitatorsToken); } pos.end(telecomToken); diff --git a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncDataTest.java b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncDataTest.java index dccc26af8024c..7b5c57fd19615 100644 --- a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncDataTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncDataTest.java @@ -35,6 +35,7 @@ public class CallMetadataSyncDataTest { final byte[] appIcon = "appIcon".getBytes(); final String appName = "appName"; final String appIdentifier = "com.google.test"; + final String extendedId = "com.google.test/.InCallService"; final int status = 1; final int direction = android.companion.Telecom.Call.OUTGOING; final int control1 = 2; @@ -43,7 +44,7 @@ public class CallMetadataSyncDataTest { call.setCallerId(callerId); call.setAppIcon(appIcon); final CallMetadataSyncData.CallFacilitator callFacilitator = - new CallMetadataSyncData.CallFacilitator(appName, appIdentifier); + new CallMetadataSyncData.CallFacilitator(appName, appIdentifier, extendedId); call.setFacilitator(callFacilitator); call.setStatus(status); call.setDirection(direction); @@ -59,6 +60,8 @@ public class CallMetadataSyncDataTest { assertThat(reconstructedCall.getAppIcon()).isEqualTo(appIcon); assertThat(reconstructedCall.getFacilitator().getName()).isEqualTo(appName); assertThat(reconstructedCall.getFacilitator().getIdentifier()).isEqualTo(appIdentifier); + assertThat(reconstructedCall.getFacilitator().getExtendedIdentifier()) + .isEqualTo(extendedId); assertThat(reconstructedCall.getStatus()).isEqualTo(status); assertThat(reconstructedCall.getDirection()).isEqualTo(direction); assertThat(reconstructedCall.getControls()).containsExactly(control1, control2); diff --git a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java index 201d8f9413a25..a13cc4162ccec 100644 --- a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceCallTest.java @@ -308,6 +308,18 @@ public class CrossDeviceCallTest { .isEqualTo(CONTACT_DISPLAY_NAME); } + @Test + public void getSerializedPhoneAccountHandle_serializesCorrectly() { + final CrossDeviceCall crossDeviceCall = new CrossDeviceCall( + InstrumentationRegistry.getTargetContext(), + mUninitializedCallDetails, /* callAudioState= */ null); + + final String result = crossDeviceCall.getSerializedPhoneAccountHandle(); + + assertWithMessage("Wrong phone account handle serialization").that(result) + .isEqualTo("label::com.google.test/com.google.test.Activity"); + } + private Call.Details createCallDetails(int state, int capabilities) { return createCallDetails(state, capabilities, /* hasContactName= */ true); } diff --git a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncControllerTest.java b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncControllerTest.java index 7e392a4261c19..e6cc34351284c 100644 --- a/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/companion/datatransfer/contextsync/CrossDeviceSyncControllerTest.java @@ -195,7 +195,8 @@ public class CrossDeviceSyncControllerTest { new CrossDeviceSyncController.PhoneAccountManager(mMockContext); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addFacilitator( - new CallMetadataSyncData.CallFacilitator("name", "com.google.test")); + new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); phoneAccountManager.updateFacilitators(0, callMetadataSyncData); phoneAccountManager.updateFacilitators(0, callMetadataSyncData); verify(mMockTelecomManager, times(1)).registerPhoneAccount(any()); @@ -208,10 +209,12 @@ public class CrossDeviceSyncControllerTest { new CrossDeviceSyncController.PhoneAccountManager(mMockContext); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addFacilitator( - new CallMetadataSyncData.CallFacilitator("name", "com.google.test")); + new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); phoneAccountManager.updateFacilitators(0, callMetadataSyncData); callMetadataSyncData.addFacilitator( - new CallMetadataSyncData.CallFacilitator("name", "com.google.test2")); + new CallMetadataSyncData.CallFacilitator("name", "com.google.test2", + "com.google.test2/.InCallService")); phoneAccountManager.updateFacilitators(0, callMetadataSyncData); verify(mMockTelecomManager, times(2)).registerPhoneAccount(any()); verify(mMockTelecomManager, times(0)).unregisterPhoneAccount(any()); @@ -223,7 +226,8 @@ public class CrossDeviceSyncControllerTest { new CrossDeviceSyncController.PhoneAccountManager(mMockContext); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addFacilitator( - new CallMetadataSyncData.CallFacilitator("name", "com.google.test")); + new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); phoneAccountManager.updateFacilitators(0, callMetadataSyncData); final CallMetadataSyncData callMetadataSyncData2 = new CallMetadataSyncData(); phoneAccountManager.updateFacilitators(0, callMetadataSyncData2); @@ -236,7 +240,9 @@ public class CrossDeviceSyncControllerTest { final CallMetadataSyncData.Call call = new CallMetadataSyncData.Call(); call.setId("123abc"); call.setDirection(android.companion.Telecom.Call.INCOMING); - call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.android.test")); + call.setFacilitator( + new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addCall(call); final CrossDeviceSyncController.CallManager callManager = @@ -252,7 +258,9 @@ public class CrossDeviceSyncControllerTest { final CallMetadataSyncData.Call call = new CallMetadataSyncData.Call(); call.setId("123abc"); call.setDirection(android.companion.Telecom.Call.OUTGOING); - call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.android.test")); + call.setFacilitator( + new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); call.setCallerId("555-555-5555"); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addCall(call); @@ -269,7 +277,9 @@ public class CrossDeviceSyncControllerTest { final CallMetadataSyncData.Call call = new CallMetadataSyncData.Call(); call.setId("123abc"); call.setDirection(android.companion.Telecom.Call.OUTGOING); - call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.android.test")); + call.setFacilitator( + new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addCall(call); final CrossDeviceSyncController.CallManager callManager = @@ -316,7 +326,8 @@ public class CrossDeviceSyncControllerTest { final CallMetadataSyncData.Call call = new CallMetadataSyncData.Call(); call.setId("123abc::originalId"); call.setDirection(android.companion.Telecom.Call.INCOMING); - call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.android.test")); + call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addCall(call); final CrossDeviceSyncController.CallManager callManager = @@ -334,7 +345,8 @@ public class CrossDeviceSyncControllerTest { final CallMetadataSyncData.Call call = new CallMetadataSyncData.Call(); call.setId("123abc::originalId"); call.setDirection(android.companion.Telecom.Call.OUTGOING); - call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.android.test")); + call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); call.setCallerId("555-555-5555"); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addCall(call); @@ -352,7 +364,8 @@ public class CrossDeviceSyncControllerTest { final CallMetadataSyncData.Call call = new CallMetadataSyncData.Call(); call.setId("123abc"); call.setDirection(android.companion.Telecom.Call.INCOMING); - call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.android.test")); + call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addCall(call); final CrossDeviceSyncController.CallManager callManager = @@ -369,7 +382,8 @@ public class CrossDeviceSyncControllerTest { final CallMetadataSyncData.Call call = new CallMetadataSyncData.Call(); call.setId("123abc"); call.setDirection(android.companion.Telecom.Call.OUTGOING); - call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.android.test")); + call.setFacilitator(new CallMetadataSyncData.CallFacilitator("name", "com.google.test", + "com.google.test/.InCallService")); call.setCallerId("555-555-5555"); final CallMetadataSyncData callMetadataSyncData = new CallMetadataSyncData(); callMetadataSyncData.addCall(call);