/*
 * 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 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(String callIdPackageName, 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 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 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 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 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 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 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();
    }
}
