Per API review, correct nullability and final constraints on new Telecom APIs. Test: Build API. Fixes: 126700293 Fixes: 126699447 Fixes: 126700465 Fixes: 126702895 Fixes: 126702527 Change-Id: Ic19664b156410e79a307b2af0d5672dc19f93c59 Merged-In: Icec15403493de596194a61b27bb3e1031fdc1099
452 lines
17 KiB
Java
452 lines
17 KiB
Java
/*
|
|
* Copyright (C) 2018 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.telecom;
|
|
|
|
import android.annotation.IntDef;
|
|
import android.annotation.NonNull;
|
|
import android.annotation.Nullable;
|
|
import android.content.pm.ApplicationInfo;
|
|
import android.graphics.drawable.Icon;
|
|
import android.os.Parcel;
|
|
import android.os.Parcelable;
|
|
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
import java.util.Objects;
|
|
|
|
/**
|
|
* Encapsulates information about an incoming or outgoing {@link Call} provided by a
|
|
* {@link CallScreeningService}.
|
|
* <p>
|
|
* Call identified information is consumed by the {@link InCallService dialer} app to provide the
|
|
* user with more information about a call. This can include information such as the name of the
|
|
* caller, address, etc. Call identification information is persisted to the
|
|
* {@link android.provider.CallLog}.
|
|
*/
|
|
public final class CallIdentification implements Parcelable {
|
|
/**
|
|
* Builder for {@link CallIdentification} instances.
|
|
* <p>
|
|
* A {@link CallScreeningService} uses this class to create new instances of
|
|
* {@link CallIdentification} for a screened call.
|
|
*/
|
|
public final static class Builder {
|
|
private CharSequence mName;
|
|
private CharSequence mDescription;
|
|
private CharSequence mDetails;
|
|
private Icon mPhoto;
|
|
private int mNuisanceConfidence = CallIdentification.CONFIDENCE_UNKNOWN;
|
|
private String mPackageName;
|
|
private CharSequence mAppName;
|
|
|
|
/**
|
|
* Default builder constructor.
|
|
*/
|
|
public Builder() {
|
|
// Default constructor
|
|
}
|
|
|
|
/**
|
|
* Create instance of call identification with specified package/app name.
|
|
*
|
|
* @param callIdPackageName The package name.
|
|
* @param callIdAppName The app name.
|
|
* @hide
|
|
*/
|
|
public Builder(@NonNull String callIdPackageName, @NonNull CharSequence callIdAppName) {
|
|
mPackageName = callIdPackageName;
|
|
mAppName = callIdAppName;
|
|
}
|
|
|
|
/**
|
|
* Sets the name associated with the {@link CallIdentification} being built.
|
|
* <p>
|
|
* Could be a business name, for example.
|
|
*
|
|
* @param name The name associated with the call, or {@code null} if none is provided.
|
|
* @return Builder instance.
|
|
*/
|
|
public @NonNull Builder setName(@Nullable CharSequence name) {
|
|
mName = name;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the description associated with the {@link CallIdentification} being built.
|
|
* <p>
|
|
* A description of the call as identified by a {@link CallScreeningService}. The
|
|
* description is typically presented by Dialer apps after the
|
|
* {@link CallIdentification#getName() name} to provide a short piece of relevant
|
|
* information about the call. This could include a location, address, or a message
|
|
* regarding the potential nature of the call (e.g. potential telemarketer).
|
|
*
|
|
* @param description The call description, or {@code null} if none is provided.
|
|
* @return Builder instance.
|
|
*/
|
|
public @NonNull Builder setDescription(@Nullable CharSequence description) {
|
|
mDescription = description;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the details associated with the {@link CallIdentification} being built.
|
|
* <p>
|
|
* The details is typically presented by Dialer apps after the
|
|
* {@link CallIdentification#getName() name} and
|
|
* {@link CallIdentification#getDescription() description} to provide further clarifying
|
|
* information about the call. This could include, for example, the opening hours of a
|
|
* business, or a stats about the number of times a call has been reported as spam.
|
|
*
|
|
* @param details The call details, or {@code null} if none is provided.
|
|
* @return Builder instance.
|
|
*/
|
|
|
|
public @NonNull Builder setDetails(@Nullable CharSequence details) {
|
|
mDetails = details;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the photo associated with the {@link CallIdentification} being built.
|
|
* <p>
|
|
* This could be, for example, a business logo, or a photo of the caller.
|
|
*
|
|
* @param photo The photo associated with the call, or {@code null} if none was provided.
|
|
* @return Builder instance.
|
|
*/
|
|
public @NonNull Builder setPhoto(@Nullable Icon photo) {
|
|
mPhoto = photo;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Sets the nuisance confidence with the {@link CallIdentification} being built.
|
|
* <p>
|
|
* This can be used to specify how confident the {@link CallScreeningService} is that a call
|
|
* is or is not a nuisance call.
|
|
*
|
|
* @param nuisanceConfidence The nuisance confidence.
|
|
* @return The builder.
|
|
*/
|
|
public @NonNull Builder setNuisanceConfidence(@NuisanceConfidence int nuisanceConfidence) {
|
|
mNuisanceConfidence = nuisanceConfidence;
|
|
return this;
|
|
}
|
|
|
|
/**
|
|
* Creates a new instance of {@link CallIdentification} based on the parameters set in this
|
|
* builder.
|
|
*
|
|
* @return {@link CallIdentification} instance.
|
|
*/
|
|
public @NonNull CallIdentification build() {
|
|
return new CallIdentification(mName, mDescription, mDetails, mPhoto,
|
|
mNuisanceConfidence, mPackageName, mAppName);
|
|
}
|
|
}
|
|
|
|
/** @hide */
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
@IntDef(
|
|
prefix = { "CONFIDENCE_" },
|
|
value = {CONFIDENCE_NUISANCE, CONFIDENCE_LIKELY_NUISANCE, CONFIDENCE_UNKNOWN,
|
|
CONFIDENCE_LIKELY_NOT_NUISANCE, CONFIDENCE_NOT_NUISANCE})
|
|
public @interface NuisanceConfidence {}
|
|
|
|
/**
|
|
* Call has been identified as a nuisance call.
|
|
* <p>
|
|
* Returned from {@link #getNuisanceConfidence()} to indicate that a
|
|
* {@link CallScreeningService} to indicate how confident it is that a call is or is not a
|
|
* nuisance call.
|
|
*/
|
|
public static final int CONFIDENCE_NUISANCE = 2;
|
|
|
|
/**
|
|
* Call has been identified as a likely nuisance call.
|
|
* <p>
|
|
* Returned from {@link #getNuisanceConfidence()} to indicate that a
|
|
* {@link CallScreeningService} to indicate how confident it is that a call is or is not a
|
|
* nuisance call.
|
|
*/
|
|
public static final int CONFIDENCE_LIKELY_NUISANCE = 1;
|
|
|
|
/**
|
|
* Call could not be classified as nuisance or non-nuisance.
|
|
* <p>
|
|
* Returned from {@link #getNuisanceConfidence()} to indicate that a
|
|
* {@link CallScreeningService} to indicate how confident it is that a call is or is not a
|
|
* nuisance call.
|
|
*/
|
|
public static final int CONFIDENCE_UNKNOWN = 0;
|
|
|
|
/**
|
|
* Call has been identified as not likely to be a nuisance call.
|
|
* <p>
|
|
* Returned from {@link #getNuisanceConfidence()} to indicate that a
|
|
* {@link CallScreeningService} to indicate how confident it is that a call is or is not a
|
|
* nuisance call.
|
|
*/
|
|
public static final int CONFIDENCE_LIKELY_NOT_NUISANCE = -1;
|
|
|
|
/**
|
|
* Call has been identified as not a nuisance call.
|
|
* <p>
|
|
* Returned from {@link #getNuisanceConfidence()} to indicate that a
|
|
* {@link CallScreeningService} to indicate how confident it is that a call is or is not a
|
|
* nuisance call.
|
|
*/
|
|
public static final int CONFIDENCE_NOT_NUISANCE = -2;
|
|
|
|
/**
|
|
* Default constructor for {@link CallIdentification}.
|
|
*
|
|
* @param name The name.
|
|
* @param description The description.
|
|
* @param details The details.
|
|
* @param photo The photo.
|
|
* @param nuisanceConfidence Confidence that this is a nuisance call.
|
|
* @hide
|
|
*/
|
|
private CallIdentification(@Nullable String name, @Nullable String description,
|
|
@Nullable String details, @Nullable Icon photo,
|
|
@NuisanceConfidence int nuisanceConfidence) {
|
|
this(name, description, details, photo, nuisanceConfidence, null, null);
|
|
}
|
|
|
|
/**
|
|
* Default constructor for {@link CallIdentification}.
|
|
*
|
|
* @param name The name.
|
|
* @param description The description.
|
|
* @param details The details.
|
|
* @param photo The photo.
|
|
* @param nuisanceConfidence Confidence that this is a nuisance call.
|
|
* @param callScreeningPackageName Package name of the {@link CallScreeningService} which
|
|
* provided the call identification.
|
|
* @param callScreeningAppName App name of the {@link CallScreeningService} which provided the
|
|
* call identification.
|
|
* @hide
|
|
*/
|
|
private CallIdentification(@Nullable CharSequence name, @Nullable CharSequence description,
|
|
@Nullable CharSequence details, @Nullable Icon photo,
|
|
@NuisanceConfidence int nuisanceConfidence, @NonNull String callScreeningPackageName,
|
|
@NonNull CharSequence callScreeningAppName) {
|
|
mName = name;
|
|
mDescription = description;
|
|
mDetails = details;
|
|
mPhoto = photo;
|
|
mNuisanceConfidence = nuisanceConfidence;
|
|
mCallScreeningAppName = callScreeningAppName;
|
|
mCallScreeningPackageName = callScreeningPackageName;
|
|
}
|
|
|
|
private CharSequence mName;
|
|
private CharSequence mDescription;
|
|
private CharSequence mDetails;
|
|
private Icon mPhoto;
|
|
private int mNuisanceConfidence;
|
|
private String mCallScreeningPackageName;
|
|
private CharSequence mCallScreeningAppName;
|
|
|
|
@Override
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public void writeToParcel(Parcel parcel, int i) {
|
|
parcel.writeCharSequence(mName);
|
|
parcel.writeCharSequence(mDescription);
|
|
parcel.writeCharSequence(mDetails);
|
|
parcel.writeParcelable(mPhoto, 0);
|
|
parcel.writeInt(mNuisanceConfidence);
|
|
parcel.writeString(mCallScreeningPackageName);
|
|
parcel.writeCharSequence(mCallScreeningAppName);
|
|
}
|
|
|
|
/**
|
|
* Responsible for creating CallIdentification objects for deserialized Parcels.
|
|
*/
|
|
public static final Parcelable.Creator<CallIdentification> CREATOR =
|
|
new Parcelable.Creator<CallIdentification> () {
|
|
|
|
@Override
|
|
public CallIdentification createFromParcel(Parcel source) {
|
|
CharSequence name = source.readCharSequence();
|
|
CharSequence description = source.readCharSequence();
|
|
CharSequence details = source.readCharSequence();
|
|
Icon photo = source.readParcelable(ClassLoader.getSystemClassLoader());
|
|
int nuisanceConfidence = source.readInt();
|
|
String callScreeningPackageName = source.readString();
|
|
CharSequence callScreeningAppName = source.readCharSequence();
|
|
return new CallIdentification(name, description, details, photo,
|
|
nuisanceConfidence, callScreeningPackageName, callScreeningAppName);
|
|
}
|
|
|
|
@Override
|
|
public CallIdentification[] newArray(int size) {
|
|
return new CallIdentification[size];
|
|
}
|
|
};
|
|
|
|
/**
|
|
* The name associated with the number.
|
|
* <p>
|
|
* The name of the call as identified by a {@link CallScreeningService}. Could be a business
|
|
* name, for example.
|
|
*
|
|
* @return The name associated with the number, or {@code null} if none was provided.
|
|
*/
|
|
public final @Nullable CharSequence getName() {
|
|
return mName;
|
|
}
|
|
|
|
/**
|
|
* Description of the call.
|
|
* <p>
|
|
* A description of the call as identified by a {@link CallScreeningService}. The description
|
|
* is typically presented by Dialer apps after the {@link #getName() name} to provide a short
|
|
* piece of relevant information about the call. This could include a location, address, or a
|
|
* message regarding the potential nature of the call (e.g. potential telemarketer).
|
|
*
|
|
* @return The call description, or {@code null} if none was provided.
|
|
*/
|
|
public final @Nullable CharSequence getDescription() {
|
|
return mDescription;
|
|
}
|
|
|
|
/**
|
|
* Details of the call.
|
|
* <p>
|
|
* Details of the call as identified by a {@link CallScreeningService}. The details
|
|
* are typically presented by Dialer apps after the {@link #getName() name} and
|
|
* {@link #getDescription() description} to provide further clarifying information about the
|
|
* call. This could include, for example, the opening hours of a business, or stats about
|
|
* the number of times a call has been reported as spam.
|
|
*
|
|
* @return The call details, or {@code null} if none was provided.
|
|
*/
|
|
public final @Nullable CharSequence getDetails() {
|
|
return mDetails;
|
|
}
|
|
|
|
/**
|
|
* Photo associated with the call.
|
|
* <p>
|
|
* A photo associated with the call as identified by a {@link CallScreeningService}. This
|
|
* could be, for example, a business logo, or a photo of the caller.
|
|
*
|
|
* @return The photo associated with the call, or {@code null} if none was provided.
|
|
*/
|
|
public final @Nullable Icon getPhoto() {
|
|
return mPhoto;
|
|
}
|
|
|
|
/**
|
|
* Indicates the likelihood that this call is a nuisance call.
|
|
* <p>
|
|
* How likely the call is a nuisance call, as identified by a {@link CallScreeningService}.
|
|
*
|
|
* @return The nuisance confidence.
|
|
*/
|
|
public final @NuisanceConfidence int getNuisanceConfidence() {
|
|
return mNuisanceConfidence;
|
|
}
|
|
|
|
/**
|
|
* The package name of the {@link CallScreeningService} which provided the
|
|
* {@link CallIdentification}.
|
|
* <p>
|
|
* A {@link CallScreeningService} may not set this property; it is set by the system.
|
|
* @return the package name
|
|
*/
|
|
public final @NonNull String getCallScreeningPackageName() {
|
|
return mCallScreeningPackageName;
|
|
}
|
|
|
|
/**
|
|
* The {@link android.content.pm.PackageManager#getApplicationLabel(ApplicationInfo) name} of
|
|
* the {@link CallScreeningService} which provided the {@link CallIdentification}.
|
|
* <p>
|
|
* A {@link CallScreeningService} may not set this property; it is set by the system.
|
|
*
|
|
* @return The name of the app.
|
|
*/
|
|
public final @NonNull CharSequence getCallScreeningAppName() {
|
|
return mCallScreeningAppName;
|
|
}
|
|
|
|
/**
|
|
* Set the package name of the {@link CallScreeningService} which provided this information.
|
|
*
|
|
* @param callScreeningPackageName The package name.
|
|
* @hide
|
|
*/
|
|
public void setCallScreeningPackageName(@NonNull String callScreeningPackageName) {
|
|
mCallScreeningPackageName = callScreeningPackageName;
|
|
}
|
|
|
|
/**
|
|
* Set the app name of the {@link CallScreeningService} which provided this information.
|
|
*
|
|
* @param callScreeningAppName The app name.
|
|
* @hide
|
|
*/
|
|
public void setCallScreeningAppName(@NonNull CharSequence callScreeningAppName) {
|
|
mCallScreeningAppName = callScreeningAppName;
|
|
}
|
|
|
|
@Override
|
|
public boolean equals(Object o) {
|
|
if (this == o) return true;
|
|
if (o == null || getClass() != o.getClass()) return false;
|
|
CallIdentification that = (CallIdentification) o;
|
|
// Note: mPhoto purposely omit as no good comparison exists.
|
|
return mNuisanceConfidence == that.mNuisanceConfidence
|
|
&& Objects.equals(mName, that.mName)
|
|
&& Objects.equals(mDescription, that.mDescription)
|
|
&& Objects.equals(mDetails, that.mDetails)
|
|
&& Objects.equals(mCallScreeningAppName, that.mCallScreeningAppName)
|
|
&& Objects.equals(mCallScreeningPackageName, that.mCallScreeningPackageName);
|
|
}
|
|
|
|
@Override
|
|
public int hashCode() {
|
|
return Objects.hash(mName, mDescription, mDetails, mPhoto, mNuisanceConfidence,
|
|
mCallScreeningAppName, mCallScreeningPackageName);
|
|
}
|
|
|
|
@Override
|
|
public String toString() {
|
|
StringBuilder sb = new StringBuilder();
|
|
sb.append("[CallId mName=");
|
|
sb.append(Log.pii(mName));
|
|
sb.append(", mDesc=");
|
|
sb.append(mDescription);
|
|
sb.append(", mDet=");
|
|
sb.append(mDetails);
|
|
sb.append(", conf=");
|
|
sb.append(mNuisanceConfidence);
|
|
sb.append(", appName=");
|
|
sb.append(mCallScreeningAppName);
|
|
sb.append(", pkgName=");
|
|
sb.append(mCallScreeningPackageName);
|
|
return sb.toString();
|
|
}
|
|
}
|