|  | /* | 
|  | * Copyright (C) 2015 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.net.Uri; | 
|  | import android.os.Parcel; | 
|  | import android.os.Parcelable; | 
|  |  | 
|  | /** | 
|  | * Represents a single voicemail stored in the voicemail content provider. | 
|  | * | 
|  | * @hide | 
|  | */ | 
|  | public class Voicemail implements Parcelable { | 
|  | private final Long mTimestamp; | 
|  | private final String mNumber; | 
|  | private final PhoneAccountHandle mPhoneAccount; | 
|  | private final Long mId; | 
|  | private final Long mDuration; | 
|  | private final String mSource; | 
|  | private final String mProviderData; | 
|  | private final Uri mUri; | 
|  | private final Boolean mIsRead; | 
|  | private final Boolean mHasContent; | 
|  | private final String mTranscription; | 
|  |  | 
|  | private Voicemail(Long timestamp, String number, PhoneAccountHandle phoneAccountHandle, Long id, | 
|  | Long duration, String source, String providerData, Uri uri, Boolean isRead, | 
|  | Boolean hasContent, String transcription) { | 
|  | mTimestamp = timestamp; | 
|  | mNumber = number; | 
|  | mPhoneAccount = phoneAccountHandle; | 
|  | mId = id; | 
|  | mDuration = duration; | 
|  | mSource = source; | 
|  | mProviderData = providerData; | 
|  | mUri = uri; | 
|  | mIsRead = isRead; | 
|  | mHasContent = hasContent; | 
|  | mTranscription = transcription; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Create a {@link Builder} for a new {@link Voicemail} to be inserted. | 
|  | * <p> | 
|  | * The number and the timestamp are mandatory for insertion. | 
|  | */ | 
|  | public static Builder createForInsertion(long timestamp, String number) { | 
|  | return new Builder().setNumber(number).setTimestamp(timestamp); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Create a {@link Builder} for a {@link Voicemail} to be updated (or deleted). | 
|  | * <p> | 
|  | * The id and source data fields are mandatory for update - id is necessary for updating the | 
|  | * database and source data is necessary for updating the server. | 
|  | */ | 
|  | public static Builder createForUpdate(long id, String sourceData) { | 
|  | return new Builder().setId(id).setSourceData(sourceData); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Builder pattern for creating a {@link Voicemail}. The builder must be created with the | 
|  | * {@link #createForInsertion(long, String)} method. | 
|  | * <p> | 
|  | * This class is <b>not thread safe</b> | 
|  | */ | 
|  | public static class Builder { | 
|  | private Long mBuilderTimestamp; | 
|  | private String mBuilderNumber; | 
|  | private PhoneAccountHandle mBuilderPhoneAccount; | 
|  | private Long mBuilderId; | 
|  | private Long mBuilderDuration; | 
|  | private String mBuilderSourcePackage; | 
|  | private String mBuilderSourceData; | 
|  | private Uri mBuilderUri; | 
|  | private Boolean mBuilderIsRead; | 
|  | private boolean mBuilderHasContent; | 
|  | private String mBuilderTranscription; | 
|  |  | 
|  | /** You should use the correct factory method to construct a builder. */ | 
|  | private Builder() { | 
|  | } | 
|  |  | 
|  | public Builder setNumber(String number) { | 
|  | mBuilderNumber = number; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setTimestamp(long timestamp) { | 
|  | mBuilderTimestamp = timestamp; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setPhoneAccount(PhoneAccountHandle phoneAccount) { | 
|  | mBuilderPhoneAccount = phoneAccount; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setId(long id) { | 
|  | mBuilderId = id; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setDuration(long duration) { | 
|  | mBuilderDuration = duration; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setSourcePackage(String sourcePackage) { | 
|  | mBuilderSourcePackage = sourcePackage; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setSourceData(String sourceData) { | 
|  | mBuilderSourceData = sourceData; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setUri(Uri uri) { | 
|  | mBuilderUri = uri; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setIsRead(boolean isRead) { | 
|  | mBuilderIsRead = isRead; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setHasContent(boolean hasContent) { | 
|  | mBuilderHasContent = hasContent; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Builder setTranscription(String transcription) { | 
|  | mBuilderTranscription = transcription; | 
|  | return this; | 
|  | } | 
|  |  | 
|  | public Voicemail build() { | 
|  | mBuilderId = mBuilderId == null ? -1 : mBuilderId; | 
|  | mBuilderTimestamp = mBuilderTimestamp == null ? 0 : mBuilderTimestamp; | 
|  | mBuilderDuration = mBuilderDuration == null ? 0: mBuilderDuration; | 
|  | mBuilderIsRead = mBuilderIsRead == null ? false : mBuilderIsRead; | 
|  | return new Voicemail(mBuilderTimestamp, mBuilderNumber, mBuilderPhoneAccount, | 
|  | mBuilderId, mBuilderDuration, mBuilderSourcePackage, mBuilderSourceData, | 
|  | mBuilderUri, mBuilderIsRead, mBuilderHasContent, mBuilderTranscription); | 
|  | } | 
|  | } | 
|  |  | 
|  | /** | 
|  | * The identifier of the voicemail in the content provider. | 
|  | * <p> | 
|  | * This may be missing in the case of a new {@link Voicemail} that we plan to insert into the | 
|  | * content provider, since until it has been inserted we don't know what id it should have. If | 
|  | * none is specified, we return -1. | 
|  | */ | 
|  | public long getId() { | 
|  | return mId; | 
|  | } | 
|  |  | 
|  | /** The number of the person leaving the voicemail, empty string if unknown, null if not set. */ | 
|  | public String getNumber() { | 
|  | return mNumber; | 
|  | } | 
|  |  | 
|  | /** The phone account associated with the voicemail, null if not set. */ | 
|  | public PhoneAccountHandle getPhoneAccount() { | 
|  | return mPhoneAccount; | 
|  | } | 
|  |  | 
|  | /** The timestamp the voicemail was received, in millis since the epoch, zero if not set. */ | 
|  | public long getTimestampMillis() { | 
|  | return mTimestamp; | 
|  | } | 
|  |  | 
|  | /** Gets the duration of the voicemail in millis, or zero if the field is not set. */ | 
|  | public long getDuration() { | 
|  | return mDuration; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the package name of the source that added this voicemail, or null if this field is | 
|  | * not set. | 
|  | */ | 
|  | public String getSourcePackage() { | 
|  | return mSource; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the application-specific data type stored with the voicemail, or null if this field | 
|  | * is not set. | 
|  | * <p> | 
|  | * Source data is typically used as an identifier to uniquely identify the voicemail against | 
|  | * the voicemail server. This is likely to be something like the IMAP UID, or some other | 
|  | * server-generated identifying string. | 
|  | */ | 
|  | public String getSourceData() { | 
|  | return mProviderData; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Gets the Uri that can be used to refer to this voicemail, and to make it play. | 
|  | * <p> | 
|  | * Returns null if we don't know the Uri. | 
|  | */ | 
|  | public Uri getUri() { | 
|  | return mUri; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Tells us if the voicemail message has been marked as read. | 
|  | * <p> | 
|  | * Always returns false if this field has not been set, i.e. if hasRead() returns false. | 
|  | */ | 
|  | public boolean isRead() { | 
|  | return mIsRead; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Tells us if there is content stored at the Uri. | 
|  | */ | 
|  | public boolean hasContent() { | 
|  | return mHasContent; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * Returns the text transcription of this voicemail, or null if this field is not set. | 
|  | */ | 
|  | public String getTranscription() { | 
|  | return mTranscription; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public int describeContents() { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void writeToParcel(Parcel dest, int flags) { | 
|  | dest.writeLong(mTimestamp); | 
|  | dest.writeCharSequence(mNumber); | 
|  | if (mPhoneAccount == null) { | 
|  | dest.writeInt(0); | 
|  | } else { | 
|  | dest.writeInt(1); | 
|  | mPhoneAccount.writeToParcel(dest, flags); | 
|  | } | 
|  | dest.writeLong(mId); | 
|  | dest.writeLong(mDuration); | 
|  | dest.writeCharSequence(mSource); | 
|  | dest.writeCharSequence(mProviderData); | 
|  | if (mUri == null) { | 
|  | dest.writeInt(0); | 
|  | } else { | 
|  | dest.writeInt(1); | 
|  | mUri.writeToParcel(dest, flags); | 
|  | } | 
|  | if (mIsRead) { | 
|  | dest.writeInt(1); | 
|  | } else { | 
|  | dest.writeInt(0); | 
|  | } | 
|  | if (mHasContent) { | 
|  | dest.writeInt(1); | 
|  | } else { | 
|  | dest.writeInt(0); | 
|  | } | 
|  | dest.writeCharSequence(mTranscription); | 
|  | } | 
|  |  | 
|  | public static final @android.annotation.NonNull Creator<Voicemail> CREATOR | 
|  | = new Creator<Voicemail>() { | 
|  | @Override | 
|  | public Voicemail createFromParcel(Parcel in) { | 
|  | return new Voicemail(in); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Voicemail[] newArray(int size) { | 
|  | return new Voicemail[size]; | 
|  | } | 
|  | }; | 
|  |  | 
|  | private Voicemail(Parcel in) { | 
|  | mTimestamp = in.readLong(); | 
|  | mNumber = (String) in.readCharSequence(); | 
|  | if (in.readInt() > 0) { | 
|  | mPhoneAccount = PhoneAccountHandle.CREATOR.createFromParcel(in); | 
|  | } else { | 
|  | mPhoneAccount = null; | 
|  | } | 
|  | mId = in.readLong(); | 
|  | mDuration = in.readLong(); | 
|  | mSource = (String) in.readCharSequence(); | 
|  | mProviderData = (String) in.readCharSequence(); | 
|  | if (in.readInt() > 0) { | 
|  | mUri = Uri.CREATOR.createFromParcel(in); | 
|  | } else { | 
|  | mUri = null; | 
|  | } | 
|  | mIsRead = in.readInt() > 0 ? true : false; | 
|  | mHasContent = in.readInt() > 0 ? true : false; | 
|  | mTranscription = (String) in.readCharSequence(); | 
|  | } | 
|  | } |