Loading core/proto/android/companion/telecom.proto +15 −14 Original line number Original line Diff line number Diff line Loading @@ -25,7 +25,7 @@ message Telecom { // Next index: 6 // Next index: 6 message Call { message Call { // UUID representing this call // UUID representing this call int64 id = 1; string id = 1; message Origin { message Origin { // Caller's name and/or phone number; what a user would see displayed when receiving an // Caller's name and/or phone number; what a user would see displayed when receiving an Loading @@ -48,6 +48,9 @@ message Telecom { } } Status status = 3; Status status = 3; repeated Control controls = 4; } enum Control { enum Control { UNKNOWN_CONTROL = 0; UNKNOWN_CONTROL = 0; ACCEPT = 1; ACCEPT = 1; Loading @@ -61,8 +64,6 @@ message Telecom { REJECT_AND_BLOCK = 9; REJECT_AND_BLOCK = 9; IGNORE = 10; IGNORE = 10; } } repeated Control controls = 4; } // The list of active calls. // The list of active calls. repeated Call calls = 1; repeated Call calls = 1; Loading services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncConnectionService.java +21 −28 Original line number Original line Diff line number Diff line Loading @@ -128,9 +128,9 @@ public class CallMetadataSyncConnectionService extends ConnectionService { private static final class CallMetadataSyncConnectionIdentifier { private static final class CallMetadataSyncConnectionIdentifier { private final int mAssociationId; private final int mAssociationId; private final long mCallId; private final String mCallId; CallMetadataSyncConnectionIdentifier(int associationId, long callId) { CallMetadataSyncConnectionIdentifier(int associationId, String callId) { mAssociationId = associationId; mAssociationId = associationId; mCallId = callId; mCallId = callId; } } Loading @@ -139,7 +139,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { return mAssociationId; return mAssociationId; } } public long getCallId() { public String getCallId() { return mCallId; return mCallId; } } Loading @@ -161,9 +161,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { private abstract static class CallMetadataSyncConnectionCallback { private abstract static class CallMetadataSyncConnectionCallback { abstract void sendCallAction(int associationId, long callId, int action); abstract void sendCallAction(int associationId, String callId, int action); abstract void sendStateChange(int associationId, long callId, int newState); } } private static class CallMetadataSyncConnection extends Connection { private static class CallMetadataSyncConnection extends Connection { Loading @@ -184,7 +182,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { mCallback = callback; mCallback = callback; } } public long getCallId() { public String getCallId() { return mCall.getId(); return mCall.getId(); } } Loading @@ -205,22 +203,22 @@ public class CallMetadataSyncConnectionService extends ConnectionService { } } final Bundle extras = new Bundle(); final Bundle extras = new Bundle(); extras.putLong(CrossDeviceCall.EXTRA_CALL_ID, mCall.getId()); extras.putString(CrossDeviceCall.EXTRA_CALL_ID, mCall.getId()); putExtras(extras); putExtras(extras); int capabilities = getConnectionCapabilities(); int capabilities = getConnectionCapabilities(); if (mCall.hasControl(android.companion.Telecom.Call.PUT_ON_HOLD)) { if (mCall.hasControl(android.companion.Telecom.PUT_ON_HOLD)) { capabilities |= CAPABILITY_HOLD; capabilities |= CAPABILITY_HOLD; } else { } else { capabilities &= ~CAPABILITY_HOLD; capabilities &= ~CAPABILITY_HOLD; } } if (mCall.hasControl(android.companion.Telecom.Call.MUTE)) { if (mCall.hasControl(android.companion.Telecom.MUTE)) { capabilities |= CAPABILITY_MUTE; capabilities |= CAPABILITY_MUTE; } else { } else { capabilities &= ~CAPABILITY_MUTE; capabilities &= ~CAPABILITY_MUTE; } } mAudioManager.setMicrophoneMute( mAudioManager.setMicrophoneMute( mCall.hasControl(android.companion.Telecom.Call.UNMUTE)); mCall.hasControl(android.companion.Telecom.UNMUTE)); if (capabilities != getConnectionCapabilities()) { if (capabilities != getConnectionCapabilities()) { setConnectionCapabilities(capabilities); setConnectionCapabilities(capabilities); } } Loading Loading @@ -248,8 +246,8 @@ public class CallMetadataSyncConnectionService extends ConnectionService { int capabilities = getConnectionCapabilities(); int capabilities = getConnectionCapabilities(); final boolean hasHoldControl = mCall.hasControl( final boolean hasHoldControl = mCall.hasControl( android.companion.Telecom.Call.PUT_ON_HOLD) android.companion.Telecom.PUT_ON_HOLD) || mCall.hasControl(android.companion.Telecom.Call.TAKE_OFF_HOLD); || mCall.hasControl(android.companion.Telecom.TAKE_OFF_HOLD); if (hasHoldControl != ((getConnectionCapabilities() & CAPABILITY_HOLD) if (hasHoldControl != ((getConnectionCapabilities() & CAPABILITY_HOLD) == CAPABILITY_HOLD)) { == CAPABILITY_HOLD)) { if (hasHoldControl) { if (hasHoldControl) { Loading @@ -258,7 +256,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { capabilities &= ~CAPABILITY_HOLD; capabilities &= ~CAPABILITY_HOLD; } } } } final boolean hasMuteControl = mCall.hasControl(android.companion.Telecom.Call.MUTE); final boolean hasMuteControl = mCall.hasControl(android.companion.Telecom.MUTE); if (hasMuteControl != ((getConnectionCapabilities() & CAPABILITY_MUTE) if (hasMuteControl != ((getConnectionCapabilities() & CAPABILITY_MUTE) == CAPABILITY_MUTE)) { == CAPABILITY_MUTE)) { if (hasMuteControl) { if (hasMuteControl) { Loading @@ -268,7 +266,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { } } } } mAudioManager.setMicrophoneMute( mAudioManager.setMicrophoneMute( mCall.hasControl(android.companion.Telecom.Call.UNMUTE)); mCall.hasControl(android.companion.Telecom.UNMUTE)); if (capabilities != getConnectionCapabilities()) { if (capabilities != getConnectionCapabilities()) { setConnectionCapabilities(capabilities); setConnectionCapabilities(capabilities); } } Loading @@ -276,12 +274,12 @@ public class CallMetadataSyncConnectionService extends ConnectionService { @Override @Override public void onAnswer(int videoState) { public void onAnswer(int videoState) { sendCallAction(android.companion.Telecom.Call.ACCEPT); sendCallAction(android.companion.Telecom.ACCEPT); } } @Override @Override public void onReject() { public void onReject() { sendCallAction(android.companion.Telecom.Call.REJECT); sendCallAction(android.companion.Telecom.REJECT); } } @Override @Override Loading @@ -296,33 +294,28 @@ public class CallMetadataSyncConnectionService extends ConnectionService { @Override @Override public void onSilence() { public void onSilence() { sendCallAction(android.companion.Telecom.Call.SILENCE); sendCallAction(android.companion.Telecom.SILENCE); } } @Override @Override public void onHold() { public void onHold() { sendCallAction(android.companion.Telecom.Call.PUT_ON_HOLD); sendCallAction(android.companion.Telecom.PUT_ON_HOLD); } } @Override @Override public void onUnhold() { public void onUnhold() { sendCallAction(android.companion.Telecom.Call.TAKE_OFF_HOLD); sendCallAction(android.companion.Telecom.TAKE_OFF_HOLD); } } @Override @Override public void onMuteStateChanged(boolean isMuted) { public void onMuteStateChanged(boolean isMuted) { sendCallAction(isMuted ? android.companion.Telecom.Call.MUTE sendCallAction(isMuted ? android.companion.Telecom.MUTE : android.companion.Telecom.Call.UNMUTE); : android.companion.Telecom.UNMUTE); } } @Override @Override public void onDisconnect() { public void onDisconnect() { sendCallAction(android.companion.Telecom.Call.END); sendCallAction(android.companion.Telecom.END); } @Override public void onStateChanged(int state) { mCallback.sendStateChange(mAssociationId, mCall.getId(), state); } } private void sendCallAction(int action) { private void sendCallAction(int action) { Loading services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncData.java +8 −8 Original line number Original line Diff line number Diff line Loading @@ -33,14 +33,14 @@ import java.util.Set; /** A read-only snapshot of an {@link ContextSyncMessage}. */ /** A read-only snapshot of an {@link ContextSyncMessage}. */ class CallMetadataSyncData { class CallMetadataSyncData { final Map<Long, CallMetadataSyncData.Call> mCalls = new HashMap<>(); final Map<String, CallMetadataSyncData.Call> mCalls = new HashMap<>(); final List<CallMetadataSyncData.Call> mRequests = new ArrayList<>(); final List<CallMetadataSyncData.Call> mRequests = new ArrayList<>(); public void addCall(CallMetadataSyncData.Call call) { public void addCall(CallMetadataSyncData.Call call) { mCalls.put(call.getId(), call); mCalls.put(call.getId(), call); } } public boolean hasCall(long id) { public boolean hasCall(String id) { return mCalls.containsKey(id); return mCalls.containsKey(id); } } Loading @@ -57,7 +57,7 @@ class CallMetadataSyncData { } } public static class Call implements Parcelable { public static class Call implements Parcelable { private long mId; private String mId; private String mCallerId; private String mCallerId; private byte[] mAppIcon; private byte[] mAppIcon; private String mAppName; private String mAppName; Loading @@ -67,7 +67,7 @@ class CallMetadataSyncData { public static Call fromParcel(Parcel parcel) { public static Call fromParcel(Parcel parcel) { final Call call = new Call(); final Call call = new Call(); call.setId(parcel.readLong()); call.setId(parcel.readString()); call.setCallerId(parcel.readString()); call.setCallerId(parcel.readString()); call.setAppIcon(parcel.readBlob()); call.setAppIcon(parcel.readBlob()); call.setAppName(parcel.readString()); call.setAppName(parcel.readString()); Loading @@ -82,7 +82,7 @@ class CallMetadataSyncData { @Override @Override public void writeToParcel(Parcel parcel, int parcelableFlags) { public void writeToParcel(Parcel parcel, int parcelableFlags) { parcel.writeLong(mId); parcel.writeString(mId); parcel.writeString(mCallerId); parcel.writeString(mCallerId); parcel.writeBlob(mAppIcon); parcel.writeBlob(mAppIcon); parcel.writeString(mAppName); parcel.writeString(mAppName); Loading @@ -94,7 +94,7 @@ class CallMetadataSyncData { } } } } void setId(long id) { void setId(String id) { mId = id; mId = id; } } Loading Loading @@ -122,7 +122,7 @@ class CallMetadataSyncData { mControls.add(control); mControls.add(control); } } long getId() { String getId() { return mId; return mId; } } Loading Loading @@ -157,7 +157,7 @@ class CallMetadataSyncData { @Override @Override public boolean equals(Object other) { public boolean equals(Object other) { if (other instanceof CallMetadataSyncData.Call) { if (other instanceof CallMetadataSyncData.Call) { return ((Call) other).getId() == getId(); return mId != null && mId.equals(((Call) other).getId()); } } return false; return false; } } Loading services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncInCallService.java +13 −14 Original line number Original line Diff line number Diff line Loading @@ -41,7 +41,6 @@ import java.util.stream.Collectors; public class CallMetadataSyncInCallService extends InCallService { public class CallMetadataSyncInCallService extends InCallService { private static final String TAG = "CallMetadataIcs"; private static final String TAG = "CallMetadataIcs"; private static final long NOT_VALID = -1L; private CompanionDeviceManagerServiceInternal mCdmsi; private CompanionDeviceManagerServiceInternal mCdmsi; Loading Loading @@ -71,7 +70,7 @@ public class CallMetadataSyncInCallService extends InCallService { callMetadataSyncData.getRequests().iterator(); callMetadataSyncData.getRequests().iterator(); while (iterator.hasNext()) { while (iterator.hasNext()) { final CallMetadataSyncData.Call call = iterator.next(); final CallMetadataSyncData.Call call = iterator.next(); if (call.getId() != 0) { if (call.getId() != null) { // The call is already assigned an id; treat as control invocations. // The call is already assigned an id; treat as control invocations. for (int control : call.getControls()) { for (int control : call.getControls()) { processCallControlAction(call.getId(), control); processCallControlAction(call.getId(), control); Loading @@ -81,41 +80,41 @@ public class CallMetadataSyncInCallService extends InCallService { } } } } private void processCallControlAction(long crossDeviceCallId, private void processCallControlAction(String crossDeviceCallId, int callControlAction) { int callControlAction) { final CrossDeviceCall crossDeviceCall = getCallForId(crossDeviceCallId, final CrossDeviceCall crossDeviceCall = getCallForId(crossDeviceCallId, mCurrentCalls.values()); mCurrentCalls.values()); switch (callControlAction) { switch (callControlAction) { case android.companion.Telecom.Call.ACCEPT: case android.companion.Telecom.ACCEPT: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doAccept(); crossDeviceCall.doAccept(); } } break; break; case android.companion.Telecom.Call.REJECT: case android.companion.Telecom.REJECT: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doReject(); crossDeviceCall.doReject(); } } break; break; case android.companion.Telecom.Call.SILENCE: case android.companion.Telecom.SILENCE: doSilence(); doSilence(); break; break; case android.companion.Telecom.Call.MUTE: case android.companion.Telecom.MUTE: doMute(); doMute(); break; break; case android.companion.Telecom.Call.UNMUTE: case android.companion.Telecom.UNMUTE: doUnmute(); doUnmute(); break; break; case android.companion.Telecom.Call.END: case android.companion.Telecom.END: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doEnd(); crossDeviceCall.doEnd(); } } break; break; case android.companion.Telecom.Call.PUT_ON_HOLD: case android.companion.Telecom.PUT_ON_HOLD: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doPutOnHold(); crossDeviceCall.doPutOnHold(); } } break; break; case android.companion.Telecom.Call.TAKE_OFF_HOLD: case android.companion.Telecom.TAKE_OFF_HOLD: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doTakeOffHold(); crossDeviceCall.doTakeOffHold(); } } Loading Loading @@ -171,12 +170,12 @@ public class CallMetadataSyncInCallService extends InCallService { @Nullable @Nullable @VisibleForTesting @VisibleForTesting CrossDeviceCall getCallForId(long crossDeviceCallId, Collection<CrossDeviceCall> calls) { CrossDeviceCall getCallForId(String crossDeviceCallId, Collection<CrossDeviceCall> calls) { if (crossDeviceCallId == NOT_VALID) { if (crossDeviceCallId == null) { return null; return null; } } for (CrossDeviceCall crossDeviceCall : calls) { for (CrossDeviceCall crossDeviceCall : calls) { if (crossDeviceCall.getId() == crossDeviceCallId) { if (crossDeviceCallId.equals(crossDeviceCall.getId())) { return crossDeviceCall; return crossDeviceCall; } } } } Loading services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java +16 −19 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.telecom.Call; import android.telecom.Call; import android.telecom.CallAudioState; import android.telecom.CallAudioState; import android.telecom.VideoProfile; import android.telecom.VideoProfile; Loading @@ -34,7 +33,7 @@ import com.android.internal.annotations.VisibleForTesting; import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream; import java.util.HashSet; import java.util.HashSet; import java.util.Set; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import java.util.UUID; /** Data holder for a telecom call and additional metadata. */ /** Data holder for a telecom call and additional metadata. */ public class CrossDeviceCall { public class CrossDeviceCall { Loading @@ -45,9 +44,7 @@ public class CrossDeviceCall { "com.android.companion.datatransfer.contextsync.extra.CALL_ID"; "com.android.companion.datatransfer.contextsync.extra.CALL_ID"; private static final int APP_ICON_BITMAP_DIMENSION = 256; private static final int APP_ICON_BITMAP_DIMENSION = 256; private static final AtomicLong sNextId = new AtomicLong(1); private final String mId; private final long mId; private Call mCall; private Call mCall; @VisibleForTesting boolean mIsEnterprise; @VisibleForTesting boolean mIsEnterprise; @VisibleForTesting boolean mIsOtt; @VisibleForTesting boolean mIsOtt; Loading @@ -64,14 +61,14 @@ public class CrossDeviceCall { CallAudioState callAudioState) { CallAudioState callAudioState) { this(packageManager, call.getDetails(), callAudioState); this(packageManager, call.getDetails(), callAudioState); mCall = call; mCall = call; final Bundle extras = new Bundle(); call.putExtra(EXTRA_CALL_ID, mId); extras.putLong(EXTRA_CALL_ID, mId); call.putExtras(extras); } } CrossDeviceCall(PackageManager packageManager, Call.Details callDetails, CrossDeviceCall(PackageManager packageManager, Call.Details callDetails, CallAudioState callAudioState) { CallAudioState callAudioState) { mId = sNextId.getAndIncrement(); final String predefinedId = callDetails.getIntentExtras() != null ? callDetails.getIntentExtras().getString(EXTRA_CALL_ID) : null; mId = predefinedId != null ? predefinedId : UUID.randomUUID().toString(); mCallingAppPackageName = mCallingAppPackageName = callDetails.getAccountHandle().getComponentName().getPackageName(); callDetails.getAccountHandle().getComponentName().getPackageName(); mIsOtt = (callDetails.getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) mIsOtt = (callDetails.getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) Loading Loading @@ -145,7 +142,7 @@ public class CrossDeviceCall { if (mStatus == android.companion.Telecom.Call.RINGING) { if (mStatus == android.companion.Telecom.Call.RINGING) { mStatus = android.companion.Telecom.Call.RINGING_SILENCED; mStatus = android.companion.Telecom.Call.RINGING_SILENCED; } } mControls.remove(android.companion.Telecom.Call.SILENCE); mControls.remove(android.companion.Telecom.SILENCE); } } @VisibleForTesting @VisibleForTesting Loading @@ -156,26 +153,26 @@ public class CrossDeviceCall { mControls.clear(); mControls.clear(); if (mStatus == android.companion.Telecom.Call.RINGING if (mStatus == android.companion.Telecom.Call.RINGING || mStatus == android.companion.Telecom.Call.RINGING_SILENCED) { || mStatus == android.companion.Telecom.Call.RINGING_SILENCED) { mControls.add(android.companion.Telecom.Call.ACCEPT); mControls.add(android.companion.Telecom.ACCEPT); mControls.add(android.companion.Telecom.Call.REJECT); mControls.add(android.companion.Telecom.REJECT); if (mStatus == android.companion.Telecom.Call.RINGING) { if (mStatus == android.companion.Telecom.Call.RINGING) { mControls.add(android.companion.Telecom.Call.SILENCE); mControls.add(android.companion.Telecom.SILENCE); } } } } if (mStatus == android.companion.Telecom.Call.ONGOING if (mStatus == android.companion.Telecom.Call.ONGOING || mStatus == android.companion.Telecom.Call.ON_HOLD) { || mStatus == android.companion.Telecom.Call.ON_HOLD) { mControls.add(android.companion.Telecom.Call.END); mControls.add(android.companion.Telecom.END); if (callDetails.can(Call.Details.CAPABILITY_HOLD)) { if (callDetails.can(Call.Details.CAPABILITY_HOLD)) { mControls.add( mControls.add( mStatus == android.companion.Telecom.Call.ON_HOLD mStatus == android.companion.Telecom.Call.ON_HOLD ? android.companion.Telecom.Call.TAKE_OFF_HOLD ? android.companion.Telecom.TAKE_OFF_HOLD : android.companion.Telecom.Call.PUT_ON_HOLD); : android.companion.Telecom.PUT_ON_HOLD); } } } } if (mStatus == android.companion.Telecom.Call.ONGOING && callDetails.can( if (mStatus == android.companion.Telecom.Call.ONGOING && callDetails.can( Call.Details.CAPABILITY_MUTE)) { Call.Details.CAPABILITY_MUTE)) { mControls.add(mIsMuted ? android.companion.Telecom.Call.UNMUTE mControls.add(mIsMuted ? android.companion.Telecom.UNMUTE : android.companion.Telecom.Call.MUTE); : android.companion.Telecom.MUTE); } } } } Loading Loading @@ -212,7 +209,7 @@ public class CrossDeviceCall { } } } } public long getId() { public String getId() { return mId; return mId; } } Loading Loading
core/proto/android/companion/telecom.proto +15 −14 Original line number Original line Diff line number Diff line Loading @@ -25,7 +25,7 @@ message Telecom { // Next index: 6 // Next index: 6 message Call { message Call { // UUID representing this call // UUID representing this call int64 id = 1; string id = 1; message Origin { message Origin { // Caller's name and/or phone number; what a user would see displayed when receiving an // Caller's name and/or phone number; what a user would see displayed when receiving an Loading @@ -48,6 +48,9 @@ message Telecom { } } Status status = 3; Status status = 3; repeated Control controls = 4; } enum Control { enum Control { UNKNOWN_CONTROL = 0; UNKNOWN_CONTROL = 0; ACCEPT = 1; ACCEPT = 1; Loading @@ -61,8 +64,6 @@ message Telecom { REJECT_AND_BLOCK = 9; REJECT_AND_BLOCK = 9; IGNORE = 10; IGNORE = 10; } } repeated Control controls = 4; } // The list of active calls. // The list of active calls. repeated Call calls = 1; repeated Call calls = 1; Loading
services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncConnectionService.java +21 −28 Original line number Original line Diff line number Diff line Loading @@ -128,9 +128,9 @@ public class CallMetadataSyncConnectionService extends ConnectionService { private static final class CallMetadataSyncConnectionIdentifier { private static final class CallMetadataSyncConnectionIdentifier { private final int mAssociationId; private final int mAssociationId; private final long mCallId; private final String mCallId; CallMetadataSyncConnectionIdentifier(int associationId, long callId) { CallMetadataSyncConnectionIdentifier(int associationId, String callId) { mAssociationId = associationId; mAssociationId = associationId; mCallId = callId; mCallId = callId; } } Loading @@ -139,7 +139,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { return mAssociationId; return mAssociationId; } } public long getCallId() { public String getCallId() { return mCallId; return mCallId; } } Loading @@ -161,9 +161,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { private abstract static class CallMetadataSyncConnectionCallback { private abstract static class CallMetadataSyncConnectionCallback { abstract void sendCallAction(int associationId, long callId, int action); abstract void sendCallAction(int associationId, String callId, int action); abstract void sendStateChange(int associationId, long callId, int newState); } } private static class CallMetadataSyncConnection extends Connection { private static class CallMetadataSyncConnection extends Connection { Loading @@ -184,7 +182,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { mCallback = callback; mCallback = callback; } } public long getCallId() { public String getCallId() { return mCall.getId(); return mCall.getId(); } } Loading @@ -205,22 +203,22 @@ public class CallMetadataSyncConnectionService extends ConnectionService { } } final Bundle extras = new Bundle(); final Bundle extras = new Bundle(); extras.putLong(CrossDeviceCall.EXTRA_CALL_ID, mCall.getId()); extras.putString(CrossDeviceCall.EXTRA_CALL_ID, mCall.getId()); putExtras(extras); putExtras(extras); int capabilities = getConnectionCapabilities(); int capabilities = getConnectionCapabilities(); if (mCall.hasControl(android.companion.Telecom.Call.PUT_ON_HOLD)) { if (mCall.hasControl(android.companion.Telecom.PUT_ON_HOLD)) { capabilities |= CAPABILITY_HOLD; capabilities |= CAPABILITY_HOLD; } else { } else { capabilities &= ~CAPABILITY_HOLD; capabilities &= ~CAPABILITY_HOLD; } } if (mCall.hasControl(android.companion.Telecom.Call.MUTE)) { if (mCall.hasControl(android.companion.Telecom.MUTE)) { capabilities |= CAPABILITY_MUTE; capabilities |= CAPABILITY_MUTE; } else { } else { capabilities &= ~CAPABILITY_MUTE; capabilities &= ~CAPABILITY_MUTE; } } mAudioManager.setMicrophoneMute( mAudioManager.setMicrophoneMute( mCall.hasControl(android.companion.Telecom.Call.UNMUTE)); mCall.hasControl(android.companion.Telecom.UNMUTE)); if (capabilities != getConnectionCapabilities()) { if (capabilities != getConnectionCapabilities()) { setConnectionCapabilities(capabilities); setConnectionCapabilities(capabilities); } } Loading Loading @@ -248,8 +246,8 @@ public class CallMetadataSyncConnectionService extends ConnectionService { int capabilities = getConnectionCapabilities(); int capabilities = getConnectionCapabilities(); final boolean hasHoldControl = mCall.hasControl( final boolean hasHoldControl = mCall.hasControl( android.companion.Telecom.Call.PUT_ON_HOLD) android.companion.Telecom.PUT_ON_HOLD) || mCall.hasControl(android.companion.Telecom.Call.TAKE_OFF_HOLD); || mCall.hasControl(android.companion.Telecom.TAKE_OFF_HOLD); if (hasHoldControl != ((getConnectionCapabilities() & CAPABILITY_HOLD) if (hasHoldControl != ((getConnectionCapabilities() & CAPABILITY_HOLD) == CAPABILITY_HOLD)) { == CAPABILITY_HOLD)) { if (hasHoldControl) { if (hasHoldControl) { Loading @@ -258,7 +256,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { capabilities &= ~CAPABILITY_HOLD; capabilities &= ~CAPABILITY_HOLD; } } } } final boolean hasMuteControl = mCall.hasControl(android.companion.Telecom.Call.MUTE); final boolean hasMuteControl = mCall.hasControl(android.companion.Telecom.MUTE); if (hasMuteControl != ((getConnectionCapabilities() & CAPABILITY_MUTE) if (hasMuteControl != ((getConnectionCapabilities() & CAPABILITY_MUTE) == CAPABILITY_MUTE)) { == CAPABILITY_MUTE)) { if (hasMuteControl) { if (hasMuteControl) { Loading @@ -268,7 +266,7 @@ public class CallMetadataSyncConnectionService extends ConnectionService { } } } } mAudioManager.setMicrophoneMute( mAudioManager.setMicrophoneMute( mCall.hasControl(android.companion.Telecom.Call.UNMUTE)); mCall.hasControl(android.companion.Telecom.UNMUTE)); if (capabilities != getConnectionCapabilities()) { if (capabilities != getConnectionCapabilities()) { setConnectionCapabilities(capabilities); setConnectionCapabilities(capabilities); } } Loading @@ -276,12 +274,12 @@ public class CallMetadataSyncConnectionService extends ConnectionService { @Override @Override public void onAnswer(int videoState) { public void onAnswer(int videoState) { sendCallAction(android.companion.Telecom.Call.ACCEPT); sendCallAction(android.companion.Telecom.ACCEPT); } } @Override @Override public void onReject() { public void onReject() { sendCallAction(android.companion.Telecom.Call.REJECT); sendCallAction(android.companion.Telecom.REJECT); } } @Override @Override Loading @@ -296,33 +294,28 @@ public class CallMetadataSyncConnectionService extends ConnectionService { @Override @Override public void onSilence() { public void onSilence() { sendCallAction(android.companion.Telecom.Call.SILENCE); sendCallAction(android.companion.Telecom.SILENCE); } } @Override @Override public void onHold() { public void onHold() { sendCallAction(android.companion.Telecom.Call.PUT_ON_HOLD); sendCallAction(android.companion.Telecom.PUT_ON_HOLD); } } @Override @Override public void onUnhold() { public void onUnhold() { sendCallAction(android.companion.Telecom.Call.TAKE_OFF_HOLD); sendCallAction(android.companion.Telecom.TAKE_OFF_HOLD); } } @Override @Override public void onMuteStateChanged(boolean isMuted) { public void onMuteStateChanged(boolean isMuted) { sendCallAction(isMuted ? android.companion.Telecom.Call.MUTE sendCallAction(isMuted ? android.companion.Telecom.MUTE : android.companion.Telecom.Call.UNMUTE); : android.companion.Telecom.UNMUTE); } } @Override @Override public void onDisconnect() { public void onDisconnect() { sendCallAction(android.companion.Telecom.Call.END); sendCallAction(android.companion.Telecom.END); } @Override public void onStateChanged(int state) { mCallback.sendStateChange(mAssociationId, mCall.getId(), state); } } private void sendCallAction(int action) { private void sendCallAction(int action) { Loading
services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncData.java +8 −8 Original line number Original line Diff line number Diff line Loading @@ -33,14 +33,14 @@ import java.util.Set; /** A read-only snapshot of an {@link ContextSyncMessage}. */ /** A read-only snapshot of an {@link ContextSyncMessage}. */ class CallMetadataSyncData { class CallMetadataSyncData { final Map<Long, CallMetadataSyncData.Call> mCalls = new HashMap<>(); final Map<String, CallMetadataSyncData.Call> mCalls = new HashMap<>(); final List<CallMetadataSyncData.Call> mRequests = new ArrayList<>(); final List<CallMetadataSyncData.Call> mRequests = new ArrayList<>(); public void addCall(CallMetadataSyncData.Call call) { public void addCall(CallMetadataSyncData.Call call) { mCalls.put(call.getId(), call); mCalls.put(call.getId(), call); } } public boolean hasCall(long id) { public boolean hasCall(String id) { return mCalls.containsKey(id); return mCalls.containsKey(id); } } Loading @@ -57,7 +57,7 @@ class CallMetadataSyncData { } } public static class Call implements Parcelable { public static class Call implements Parcelable { private long mId; private String mId; private String mCallerId; private String mCallerId; private byte[] mAppIcon; private byte[] mAppIcon; private String mAppName; private String mAppName; Loading @@ -67,7 +67,7 @@ class CallMetadataSyncData { public static Call fromParcel(Parcel parcel) { public static Call fromParcel(Parcel parcel) { final Call call = new Call(); final Call call = new Call(); call.setId(parcel.readLong()); call.setId(parcel.readString()); call.setCallerId(parcel.readString()); call.setCallerId(parcel.readString()); call.setAppIcon(parcel.readBlob()); call.setAppIcon(parcel.readBlob()); call.setAppName(parcel.readString()); call.setAppName(parcel.readString()); Loading @@ -82,7 +82,7 @@ class CallMetadataSyncData { @Override @Override public void writeToParcel(Parcel parcel, int parcelableFlags) { public void writeToParcel(Parcel parcel, int parcelableFlags) { parcel.writeLong(mId); parcel.writeString(mId); parcel.writeString(mCallerId); parcel.writeString(mCallerId); parcel.writeBlob(mAppIcon); parcel.writeBlob(mAppIcon); parcel.writeString(mAppName); parcel.writeString(mAppName); Loading @@ -94,7 +94,7 @@ class CallMetadataSyncData { } } } } void setId(long id) { void setId(String id) { mId = id; mId = id; } } Loading Loading @@ -122,7 +122,7 @@ class CallMetadataSyncData { mControls.add(control); mControls.add(control); } } long getId() { String getId() { return mId; return mId; } } Loading Loading @@ -157,7 +157,7 @@ class CallMetadataSyncData { @Override @Override public boolean equals(Object other) { public boolean equals(Object other) { if (other instanceof CallMetadataSyncData.Call) { if (other instanceof CallMetadataSyncData.Call) { return ((Call) other).getId() == getId(); return mId != null && mId.equals(((Call) other).getId()); } } return false; return false; } } Loading
services/companion/java/com/android/server/companion/datatransfer/contextsync/CallMetadataSyncInCallService.java +13 −14 Original line number Original line Diff line number Diff line Loading @@ -41,7 +41,6 @@ import java.util.stream.Collectors; public class CallMetadataSyncInCallService extends InCallService { public class CallMetadataSyncInCallService extends InCallService { private static final String TAG = "CallMetadataIcs"; private static final String TAG = "CallMetadataIcs"; private static final long NOT_VALID = -1L; private CompanionDeviceManagerServiceInternal mCdmsi; private CompanionDeviceManagerServiceInternal mCdmsi; Loading Loading @@ -71,7 +70,7 @@ public class CallMetadataSyncInCallService extends InCallService { callMetadataSyncData.getRequests().iterator(); callMetadataSyncData.getRequests().iterator(); while (iterator.hasNext()) { while (iterator.hasNext()) { final CallMetadataSyncData.Call call = iterator.next(); final CallMetadataSyncData.Call call = iterator.next(); if (call.getId() != 0) { if (call.getId() != null) { // The call is already assigned an id; treat as control invocations. // The call is already assigned an id; treat as control invocations. for (int control : call.getControls()) { for (int control : call.getControls()) { processCallControlAction(call.getId(), control); processCallControlAction(call.getId(), control); Loading @@ -81,41 +80,41 @@ public class CallMetadataSyncInCallService extends InCallService { } } } } private void processCallControlAction(long crossDeviceCallId, private void processCallControlAction(String crossDeviceCallId, int callControlAction) { int callControlAction) { final CrossDeviceCall crossDeviceCall = getCallForId(crossDeviceCallId, final CrossDeviceCall crossDeviceCall = getCallForId(crossDeviceCallId, mCurrentCalls.values()); mCurrentCalls.values()); switch (callControlAction) { switch (callControlAction) { case android.companion.Telecom.Call.ACCEPT: case android.companion.Telecom.ACCEPT: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doAccept(); crossDeviceCall.doAccept(); } } break; break; case android.companion.Telecom.Call.REJECT: case android.companion.Telecom.REJECT: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doReject(); crossDeviceCall.doReject(); } } break; break; case android.companion.Telecom.Call.SILENCE: case android.companion.Telecom.SILENCE: doSilence(); doSilence(); break; break; case android.companion.Telecom.Call.MUTE: case android.companion.Telecom.MUTE: doMute(); doMute(); break; break; case android.companion.Telecom.Call.UNMUTE: case android.companion.Telecom.UNMUTE: doUnmute(); doUnmute(); break; break; case android.companion.Telecom.Call.END: case android.companion.Telecom.END: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doEnd(); crossDeviceCall.doEnd(); } } break; break; case android.companion.Telecom.Call.PUT_ON_HOLD: case android.companion.Telecom.PUT_ON_HOLD: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doPutOnHold(); crossDeviceCall.doPutOnHold(); } } break; break; case android.companion.Telecom.Call.TAKE_OFF_HOLD: case android.companion.Telecom.TAKE_OFF_HOLD: if (crossDeviceCall != null) { if (crossDeviceCall != null) { crossDeviceCall.doTakeOffHold(); crossDeviceCall.doTakeOffHold(); } } Loading Loading @@ -171,12 +170,12 @@ public class CallMetadataSyncInCallService extends InCallService { @Nullable @Nullable @VisibleForTesting @VisibleForTesting CrossDeviceCall getCallForId(long crossDeviceCallId, Collection<CrossDeviceCall> calls) { CrossDeviceCall getCallForId(String crossDeviceCallId, Collection<CrossDeviceCall> calls) { if (crossDeviceCallId == NOT_VALID) { if (crossDeviceCallId == null) { return null; return null; } } for (CrossDeviceCall crossDeviceCall : calls) { for (CrossDeviceCall crossDeviceCall : calls) { if (crossDeviceCall.getId() == crossDeviceCallId) { if (crossDeviceCallId.equals(crossDeviceCall.getId())) { return crossDeviceCall; return crossDeviceCall; } } } } Loading
services/companion/java/com/android/server/companion/datatransfer/contextsync/CrossDeviceCall.java +16 −19 Original line number Original line Diff line number Diff line Loading @@ -23,7 +23,6 @@ import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Canvas; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.telecom.Call; import android.telecom.Call; import android.telecom.CallAudioState; import android.telecom.CallAudioState; import android.telecom.VideoProfile; import android.telecom.VideoProfile; Loading @@ -34,7 +33,7 @@ import com.android.internal.annotations.VisibleForTesting; import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream; import java.util.HashSet; import java.util.HashSet; import java.util.Set; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import java.util.UUID; /** Data holder for a telecom call and additional metadata. */ /** Data holder for a telecom call and additional metadata. */ public class CrossDeviceCall { public class CrossDeviceCall { Loading @@ -45,9 +44,7 @@ public class CrossDeviceCall { "com.android.companion.datatransfer.contextsync.extra.CALL_ID"; "com.android.companion.datatransfer.contextsync.extra.CALL_ID"; private static final int APP_ICON_BITMAP_DIMENSION = 256; private static final int APP_ICON_BITMAP_DIMENSION = 256; private static final AtomicLong sNextId = new AtomicLong(1); private final String mId; private final long mId; private Call mCall; private Call mCall; @VisibleForTesting boolean mIsEnterprise; @VisibleForTesting boolean mIsEnterprise; @VisibleForTesting boolean mIsOtt; @VisibleForTesting boolean mIsOtt; Loading @@ -64,14 +61,14 @@ public class CrossDeviceCall { CallAudioState callAudioState) { CallAudioState callAudioState) { this(packageManager, call.getDetails(), callAudioState); this(packageManager, call.getDetails(), callAudioState); mCall = call; mCall = call; final Bundle extras = new Bundle(); call.putExtra(EXTRA_CALL_ID, mId); extras.putLong(EXTRA_CALL_ID, mId); call.putExtras(extras); } } CrossDeviceCall(PackageManager packageManager, Call.Details callDetails, CrossDeviceCall(PackageManager packageManager, Call.Details callDetails, CallAudioState callAudioState) { CallAudioState callAudioState) { mId = sNextId.getAndIncrement(); final String predefinedId = callDetails.getIntentExtras() != null ? callDetails.getIntentExtras().getString(EXTRA_CALL_ID) : null; mId = predefinedId != null ? predefinedId : UUID.randomUUID().toString(); mCallingAppPackageName = mCallingAppPackageName = callDetails.getAccountHandle().getComponentName().getPackageName(); callDetails.getAccountHandle().getComponentName().getPackageName(); mIsOtt = (callDetails.getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) mIsOtt = (callDetails.getCallCapabilities() & Call.Details.PROPERTY_SELF_MANAGED) Loading Loading @@ -145,7 +142,7 @@ public class CrossDeviceCall { if (mStatus == android.companion.Telecom.Call.RINGING) { if (mStatus == android.companion.Telecom.Call.RINGING) { mStatus = android.companion.Telecom.Call.RINGING_SILENCED; mStatus = android.companion.Telecom.Call.RINGING_SILENCED; } } mControls.remove(android.companion.Telecom.Call.SILENCE); mControls.remove(android.companion.Telecom.SILENCE); } } @VisibleForTesting @VisibleForTesting Loading @@ -156,26 +153,26 @@ public class CrossDeviceCall { mControls.clear(); mControls.clear(); if (mStatus == android.companion.Telecom.Call.RINGING if (mStatus == android.companion.Telecom.Call.RINGING || mStatus == android.companion.Telecom.Call.RINGING_SILENCED) { || mStatus == android.companion.Telecom.Call.RINGING_SILENCED) { mControls.add(android.companion.Telecom.Call.ACCEPT); mControls.add(android.companion.Telecom.ACCEPT); mControls.add(android.companion.Telecom.Call.REJECT); mControls.add(android.companion.Telecom.REJECT); if (mStatus == android.companion.Telecom.Call.RINGING) { if (mStatus == android.companion.Telecom.Call.RINGING) { mControls.add(android.companion.Telecom.Call.SILENCE); mControls.add(android.companion.Telecom.SILENCE); } } } } if (mStatus == android.companion.Telecom.Call.ONGOING if (mStatus == android.companion.Telecom.Call.ONGOING || mStatus == android.companion.Telecom.Call.ON_HOLD) { || mStatus == android.companion.Telecom.Call.ON_HOLD) { mControls.add(android.companion.Telecom.Call.END); mControls.add(android.companion.Telecom.END); if (callDetails.can(Call.Details.CAPABILITY_HOLD)) { if (callDetails.can(Call.Details.CAPABILITY_HOLD)) { mControls.add( mControls.add( mStatus == android.companion.Telecom.Call.ON_HOLD mStatus == android.companion.Telecom.Call.ON_HOLD ? android.companion.Telecom.Call.TAKE_OFF_HOLD ? android.companion.Telecom.TAKE_OFF_HOLD : android.companion.Telecom.Call.PUT_ON_HOLD); : android.companion.Telecom.PUT_ON_HOLD); } } } } if (mStatus == android.companion.Telecom.Call.ONGOING && callDetails.can( if (mStatus == android.companion.Telecom.Call.ONGOING && callDetails.can( Call.Details.CAPABILITY_MUTE)) { Call.Details.CAPABILITY_MUTE)) { mControls.add(mIsMuted ? android.companion.Telecom.Call.UNMUTE mControls.add(mIsMuted ? android.companion.Telecom.UNMUTE : android.companion.Telecom.Call.MUTE); : android.companion.Telecom.MUTE); } } } } Loading Loading @@ -212,7 +209,7 @@ public class CrossDeviceCall { } } } } public long getId() { public String getId() { return mId; return mId; } } Loading