From e5bec82e3aeb6e0a9294507ebb4445805f93e34a Mon Sep 17 00:00:00 2001 From: Edgar Arriaga Date: Fri, 14 Oct 2022 14:25:43 -0700 Subject: [PATCH] Expose telecom API for retrieving photo uri This API is queried when the async contact query for telecom is performed, however, it is not currently exposed to users. However, dialer apps sometimes need this information so they resort to doing the exact same query that telecom does on their own, adding significant latency to their incoming/outgoing call latencies. Bug: 240341306 Test: Manual, verified the data is sent with logs. Change-Id: I029077ac587fad9651efa0c786ee0119ea500424 --- core/api/current.txt | 1 + telecomm/java/android/telecom/Call.java | 29 +++++++++++++++---- .../java/android/telecom/ParcelableCall.java | 26 +++++++++++++++-- 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index b64afea17e0b4..c235e3c72598d 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -40449,6 +40449,7 @@ package android.telecom { method public int getCallerNumberVerificationStatus(); method public final long getConnectTimeMillis(); method @Nullable public String getContactDisplayName(); + method @Nullable public android.net.Uri getContactPhotoUri(); method public long getCreationTimeMillis(); method public android.telecom.DisconnectCause getDisconnectCause(); method public android.os.Bundle getExtras(); diff --git a/telecomm/java/android/telecom/Call.java b/telecomm/java/android/telecom/Call.java index 5cef2cb0a1613..bbdc8907275ee 100644 --- a/telecomm/java/android/telecom/Call.java +++ b/telecomm/java/android/telecom/Call.java @@ -738,6 +738,7 @@ public final class Call { private final String mContactDisplayName; private final @CallDirection int mCallDirection; private final @Connection.VerificationStatus int mCallerNumberVerificationStatus; + private final Uri mContactPhotoUri; /** * Whether the supplied capabilities supports the specified capability. @@ -944,6 +945,17 @@ public final class Call { return mHandlePresentation; } + /** + * @return The contact photo URI which corresponds to + * {@link android.provider.ContactsContract.PhoneLookup#PHOTO_URI}, or {@code null} if the + * lookup is not yet complete, if there's no contacts entry for the caller, + * or if the {@link InCallService} does not hold the + * {@link android.Manifest.permission#READ_CONTACTS} permission. + */ + public @Nullable Uri getContactPhotoUri() { + return mContactPhotoUri; + } + /** * The display name for the caller. *

@@ -1143,7 +1155,8 @@ public final class Call { Objects.equals(mContactDisplayName, d.mContactDisplayName) && Objects.equals(mCallDirection, d.mCallDirection) && Objects.equals(mCallerNumberVerificationStatus, - d.mCallerNumberVerificationStatus); + d.mCallerNumberVerificationStatus) && + Objects.equals(mContactPhotoUri, d.mContactPhotoUri); } return false; } @@ -1168,7 +1181,8 @@ public final class Call { mCreationTimeMillis, mContactDisplayName, mCallDirection, - mCallerNumberVerificationStatus); + mCallerNumberVerificationStatus, + mContactPhotoUri); } /** {@hide} */ @@ -1192,7 +1206,8 @@ public final class Call { long creationTimeMillis, String contactDisplayName, int callDirection, - int callerNumberVerificationStatus) { + int callerNumberVerificationStatus, + Uri contactPhotoUri) { mState = state; mTelecomCallId = telecomCallId; mHandle = handle; @@ -1213,6 +1228,7 @@ public final class Call { mContactDisplayName = contactDisplayName; mCallDirection = callDirection; mCallerNumberVerificationStatus = callerNumberVerificationStatus; + mContactPhotoUri = contactPhotoUri; } /** {@hide} */ @@ -1237,7 +1253,9 @@ public final class Call { parcelableCall.getCreationTimeMillis(), parcelableCall.getContactDisplayName(), parcelableCall.getCallDirection(), - parcelableCall.getCallerNumberVerificationStatus()); + parcelableCall.getCallerNumberVerificationStatus(), + parcelableCall.getContactPhotoUri() + ); } @Override @@ -2644,7 +2662,8 @@ public final class Call { mDetails.getCreationTimeMillis(), mDetails.getContactDisplayName(), mDetails.getCallDirection(), - mDetails.getCallerNumberVerificationStatus() + mDetails.getCallerNumberVerificationStatus(), + mDetails.getContactPhotoUri() ); fireDetailsChanged(mDetails); } diff --git a/telecomm/java/android/telecom/ParcelableCall.java b/telecomm/java/android/telecom/ParcelableCall.java index f412a1825e2aa..6a1318982e77a 100644 --- a/telecomm/java/android/telecom/ParcelableCall.java +++ b/telecomm/java/android/telecom/ParcelableCall.java @@ -69,6 +69,7 @@ public final class ParcelableCall implements Parcelable { private int mCallerNumberVerificationStatus; private String mContactDisplayName; private String mActiveChildCallId; + private Uri mContactPhotoUri; public ParcelableCallBuilder setId(String id) { mId = id; @@ -224,6 +225,11 @@ public final class ParcelableCall implements Parcelable { return this; } + public ParcelableCallBuilder setContactPhotoUri(Uri contactPhotoUri) { + mContactPhotoUri = contactPhotoUri; + return this; + } + public ParcelableCall createParcelableCall() { return new ParcelableCall( mId, @@ -255,7 +261,8 @@ public final class ParcelableCall implements Parcelable { mCallDirection, mCallerNumberVerificationStatus, mContactDisplayName, - mActiveChildCallId); + mActiveChildCallId, + mContactPhotoUri); } public static ParcelableCallBuilder fromParcelableCall(ParcelableCall parcelableCall) { @@ -292,6 +299,7 @@ public final class ParcelableCall implements Parcelable { parcelableCall.mCallerNumberVerificationStatus; newBuilder.mContactDisplayName = parcelableCall.mContactDisplayName; newBuilder.mActiveChildCallId = parcelableCall.mActiveChildCallId; + newBuilder.mContactPhotoUri = parcelableCall.mContactPhotoUri; return newBuilder; } } @@ -327,6 +335,7 @@ public final class ParcelableCall implements Parcelable { private final int mCallerNumberVerificationStatus; private final String mContactDisplayName; private final String mActiveChildCallId; // Only valid for CDMA conferences + private final Uri mContactPhotoUri; public ParcelableCall( String id, @@ -358,7 +367,8 @@ public final class ParcelableCall implements Parcelable { int callDirection, int callerNumberVerificationStatus, String contactDisplayName, - String activeChildCallId + String activeChildCallId, + Uri contactPhotoUri ) { mId = id; mState = state; @@ -390,6 +400,7 @@ public final class ParcelableCall implements Parcelable { mCallerNumberVerificationStatus = callerNumberVerificationStatus; mContactDisplayName = contactDisplayName; mActiveChildCallId = activeChildCallId; + mContactPhotoUri = contactPhotoUri; } /** The unique ID of the call. */ @@ -606,6 +617,14 @@ public final class ParcelableCall implements Parcelable { return mContactDisplayName; } + /** + * @return the caller photo URI. + */ + public @Nullable Uri getContactPhotoUri() { + return mContactPhotoUri; + } + + /** * @return On a CDMA conference with two participants, returns the ID of the child call that's * currently active. @@ -655,6 +674,7 @@ public final class ParcelableCall implements Parcelable { int callerNumberVerificationStatus = source.readInt(); String contactDisplayName = source.readString(); String activeChildCallId = source.readString(); + Uri contactPhotoUri = source.readParcelable(classLoader, Uri.class); return new ParcelableCallBuilder() .setId(id) .setState(state) @@ -686,6 +706,7 @@ public final class ParcelableCall implements Parcelable { .setCallerNumberVerificationStatus(callerNumberVerificationStatus) .setContactDisplayName(contactDisplayName) .setActiveChildCallId(activeChildCallId) + .setContactPhotoUri(contactPhotoUri) .createParcelableCall(); } @@ -735,6 +756,7 @@ public final class ParcelableCall implements Parcelable { destination.writeInt(mCallerNumberVerificationStatus); destination.writeString(mContactDisplayName); destination.writeString(mActiveChildCallId); + destination.writeParcelable(mContactPhotoUri, 0); } @Override