1d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/*
2d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Copyright (C) 2016 The Android Open Source Project
3d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
4d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License");
5d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * you may not use this file except in compliance with the License.
6d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * You may obtain a copy of the License at
7d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
8d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *      http://www.apache.org/licenses/LICENSE-2.0
9d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian *
10d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Unless required by applicable law or agreed to in writing, software
11d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS,
12d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * See the License for the specific language governing permissions and
14d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * limitations under the License.
15d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */
16d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.voicemail.impl;
18d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
19d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.net.Uri;
20d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.os.Parcel;
21d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.os.Parcelable;
22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.telecom.PhoneAccountHandle;
23d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.text.TextUtils;
24d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
25d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/** Represents a single voicemail stored in the voicemail content provider. */
26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpublic class Voicemail implements Parcelable {
27d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
28d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final Long mTimestamp;
29d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final String mNumber;
30d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final PhoneAccountHandle mPhoneAccount;
31d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final Long mId;
32d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final Long mDuration;
33d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final String mSource;
34d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final String mProviderData;
35d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final Uri mUri;
36d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final Boolean mIsRead;
37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final Boolean mHasContent;
38d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private final String mTranscription;
39d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
40d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private Voicemail(
41d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      Long timestamp,
42d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      String number,
43d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      PhoneAccountHandle phoneAccountHandle,
44d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      Long id,
45d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      Long duration,
46d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      String source,
47d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      String providerData,
48d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      Uri uri,
49d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      Boolean isRead,
50d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      Boolean hasContent,
51d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      String transcription) {
52d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mTimestamp = timestamp;
53d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mNumber = number;
54d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mPhoneAccount = phoneAccountHandle;
55d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mId = id;
56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mDuration = duration;
57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mSource = source;
58d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mProviderData = providerData;
59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mUri = uri;
60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mIsRead = isRead;
61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mHasContent = hasContent;
62d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mTranscription = transcription;
63d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
64d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
65d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
66d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Create a {@link Builder} for a new {@link Voicemail} to be inserted.
67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
68d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * <p>The number and the timestamp are mandatory for insertion.
69d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static Builder createForInsertion(long timestamp, String number) {
71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return new Builder().setNumber(number).setTimestamp(timestamp);
72d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
74d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Create a {@link Builder} for a {@link Voicemail} to be updated (or deleted).
76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
77d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * <p>The id and source data fields are mandatory for update - id is necessary for updating the
78d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * database and source data is necessary for updating the server.
79d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
80d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static Builder createForUpdate(long id, String sourceData) {
81d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return new Builder().setId(id).setSourceData(sourceData);
82d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
83d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
84d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
85d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Builder pattern for creating a {@link Voicemail}. The builder must be created with the {@link
86d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * #createForInsertion(long, String)} method.
87d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
88d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * <p>This class is <b>not thread safe</b>
89d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
90d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static class Builder {
91d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
92d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private Long mBuilderTimestamp;
93d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private String mBuilderNumber;
94d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private PhoneAccountHandle mBuilderPhoneAccount;
95d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private Long mBuilderId;
96d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private Long mBuilderDuration;
97d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private String mBuilderSourcePackage;
98d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private String mBuilderSourceData;
99d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private Uri mBuilderUri;
100d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private Boolean mBuilderIsRead;
101d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private boolean mBuilderHasContent;
102d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private String mBuilderTranscription;
103d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
104d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    /** You should use the correct factory method to construct a builder. */
105d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    private Builder() {}
106d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
107d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setNumber(String number) {
108d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderNumber = number;
109d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
110d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
111d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
112d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setTimestamp(long timestamp) {
113d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderTimestamp = timestamp;
114d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
115d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
116d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
117d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setPhoneAccount(PhoneAccountHandle phoneAccount) {
118d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderPhoneAccount = phoneAccount;
119d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
120d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
121d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
122d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setId(long id) {
123d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderId = id;
124d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
125d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
126d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
127d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setDuration(long duration) {
128d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderDuration = duration;
129d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
130d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
131d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
132d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setSourcePackage(String sourcePackage) {
133d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderSourcePackage = sourcePackage;
134d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
135d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
136d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
137d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setSourceData(String sourceData) {
138d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderSourceData = sourceData;
139d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
140d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
141d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
142d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setUri(Uri uri) {
143d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderUri = uri;
144d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
145d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
146d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
147d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setIsRead(boolean isRead) {
148d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderIsRead = isRead;
149d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
150d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
151d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
152d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setHasContent(boolean hasContent) {
153d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderHasContent = hasContent;
154d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
155d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
156d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
157d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Builder setTranscription(String transcription) {
158d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderTranscription = transcription;
159d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return this;
160d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
161d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
162d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    public Voicemail build() {
163d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderId = mBuilderId == null ? -1 : mBuilderId;
164d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderTimestamp = mBuilderTimestamp == null ? 0 : mBuilderTimestamp;
165d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderDuration = mBuilderDuration == null ? 0 : mBuilderDuration;
166d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mBuilderIsRead = mBuilderIsRead == null ? false : mBuilderIsRead;
167d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      return new Voicemail(
168d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderTimestamp,
169d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderNumber,
170d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderPhoneAccount,
171d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderId,
172d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderDuration,
173d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderSourcePackage,
174d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderSourceData,
175d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderUri,
176d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderIsRead,
177d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderHasContent,
178d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          mBuilderTranscription);
179d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
180d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
181d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
182d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
183d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * The identifier of the voicemail in the content provider.
184d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
185d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * <p>This may be missing in the case of a new {@link Voicemail} that we plan to insert into the
186d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * content provider, since until it has been inserted we don't know what id it should have. If
187d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * none is specified, we return -1.
188d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
189d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public long getId() {
190d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mId;
191d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
192d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
193d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The number of the person leaving the voicemail, empty string if unknown, null if not set. */
194d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public String getNumber() {
195d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mNumber;
196d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
197d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
198d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The phone account associated with the voicemail, null if not set. */
199d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public PhoneAccountHandle getPhoneAccount() {
200d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mPhoneAccount;
201d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
202d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
203d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** The timestamp the voicemail was received, in millis since the epoch, zero if not set. */
204d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public long getTimestampMillis() {
205d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mTimestamp;
206d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
207d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
208d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Gets the duration of the voicemail in millis, or zero if the field is not set. */
209d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public long getDuration() {
210d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mDuration;
211d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
212d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
213d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
214d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Returns the package name of the source that added this voicemail, or null if this field is not
215d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * set.
216d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
217d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public String getSourcePackage() {
218d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mSource;
219d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
220d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
221d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
222d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Returns the application-specific data type stored with the voicemail, or null if this field is
223d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * not set.
224d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
225d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * <p>Source data is typically used as an identifier to uniquely identify the voicemail against
226d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * the voicemail server. This is likely to be something like the IMAP UID, or some other
227d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * server-generated identifying string.
228d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
229d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public String getSourceData() {
230d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mProviderData;
231d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
232d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
233d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
234d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Gets the Uri that can be used to refer to this voicemail, and to make it play.
235d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
236d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * <p>Returns null if we don't know the Uri.
237d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
238d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public Uri getUri() {
239d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mUri;
240d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
241d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
242d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /**
243d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * Tells us if the voicemail message has been marked as read.
244d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   *
245d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   * <p>Always returns false if this field has not been set, i.e. if hasRead() returns false.
246d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian   */
247d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public boolean isRead() {
248d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mIsRead;
249d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
250d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
251d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Tells us if there is content stored at the Uri. */
252d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public boolean hasContent() {
253d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mHasContent;
254d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
255d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
256d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  /** Returns the text transcription of this voicemail, or null if this field is not set. */
257d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public String getTranscription() {
258d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return mTranscription;
259d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
260d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
261d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  @Override
262d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public int describeContents() {
263d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return 0;
264d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
265d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
266d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  @Override
267d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public void writeToParcel(Parcel dest, int flags) {
268d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    dest.writeLong(mTimestamp);
269d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    writeCharSequence(dest, mNumber);
270d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (mPhoneAccount == null) {
271d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(0);
272d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    } else {
273d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(1);
274d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mPhoneAccount.writeToParcel(dest, flags);
275d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
276d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    dest.writeLong(mId);
277d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    dest.writeLong(mDuration);
278d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    writeCharSequence(dest, mSource);
279d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    writeCharSequence(dest, mProviderData);
280d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (mUri == null) {
281d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(0);
282d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    } else {
283d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(1);
284d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mUri.writeToParcel(dest, flags);
285d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
286d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (mIsRead) {
287d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(1);
288d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    } else {
289d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(0);
290d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
291d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (mHasContent) {
292d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(1);
293d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    } else {
294d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      dest.writeInt(0);
295d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
296d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    writeCharSequence(dest, mTranscription);
297d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
298d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
299d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static final Creator<Voicemail> CREATOR =
300d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      new Creator<Voicemail>() {
301d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        @Override
302d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        public Voicemail createFromParcel(Parcel in) {
303d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          return new Voicemail(in);
304d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        }
305d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
306d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        @Override
307d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        public Voicemail[] newArray(int size) {
308d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian          return new Voicemail[size];
309d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian        }
310d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      };
311d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
312d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private Voicemail(Parcel in) {
313d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mTimestamp = in.readLong();
314d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mNumber = (String) readCharSequence(in);
315d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (in.readInt() > 0) {
316d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mPhoneAccount = PhoneAccountHandle.CREATOR.createFromParcel(in);
317d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    } else {
318d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mPhoneAccount = null;
319d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
320d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mId = in.readLong();
321d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mDuration = in.readLong();
322d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mSource = (String) readCharSequence(in);
323d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mProviderData = (String) readCharSequence(in);
324d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    if (in.readInt() > 0) {
325d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mUri = Uri.CREATOR.createFromParcel(in);
326d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    } else {
327d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian      mUri = null;
328d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    }
329d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mIsRead = in.readInt() > 0 ? true : false;
330d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mHasContent = in.readInt() > 0 ? true : false;
331d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    mTranscription = (String) readCharSequence(in);
332d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
333d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
334d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  private static CharSequence readCharSequence(Parcel in) {
335d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    return TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in);
336d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
337d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian
338d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  public static void writeCharSequence(Parcel dest, CharSequence val) {
339d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian    TextUtils.writeToParcel(val, dest, 0);
340d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian  }
341d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian}
342