18d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee/*
28d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * Copyright (C) 2011 The Android Open Source Project
38d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee *
48d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * Licensed under the Apache License, Version 2.0 (the "License");
58d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * you may not use this file except in compliance with the License.
68d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * You may obtain a copy of the License at
78d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee *
88d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee *     http://www.apache.org/licenses/LICENSE-2.0
98d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee *
108d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * Unless required by applicable law or agreed to in writing, software
118d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * distributed under the License is distributed on an "AS IS" BASIS,
128d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
138d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * See the License for the specific language governing permissions and
148d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * limitations under the License.
158d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee */
168d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
178d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjeepackage com.example.android.voicemail.common.core;
188d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
198d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjeeimport android.net.Uri;
208d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
218d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee/**
228d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee * A simple immutable data object to represent a voicemail.
238d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee */
248d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjeepublic final class VoicemailImpl implements Voicemail {
258d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final Long mTimestamp;
268d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final String mNumber;
278d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final Long mId;
288d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final Long mDuration;
298d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final String mSource;
308d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final String mProviderData;
318d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final Uri mUri;
328d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final Boolean mIsRead;
338d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private final boolean mHasContent;
348d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
358d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    // TODO: 5. We should probably consider changing "number" everywhere to "contact", given that
368d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    // it's not clear that these will be restricted to telephone numbers.
378d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
388d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    private VoicemailImpl(
398d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            Long timestamp,
408d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            String number,
418d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            Long id,
428d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            Long duration,
438d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            String source,
448d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            String providerData,
458d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            Uri uri,
468d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            Boolean isRead,
478d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            boolean hasContent) {
488d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mId = id;
498d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mNumber = number;
508d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mDuration = duration;
518d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mTimestamp = timestamp;
528d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mSource = source;
538d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mProviderData = providerData;
548d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mUri = uri;
558d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mIsRead = isRead;
568d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        mHasContent = hasContent;
578d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
588d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
598d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    /**
608d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * Create a {@link Builder} for a new {@link Voicemail} to be inserted.
618d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * <p>
628d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * The number and the timestamp are mandatory for insertion.
638d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     */
648d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public static Builder createForInsertion(long timestamp, String number) {
658d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return new Builder().setNumber(number).setTimestamp(timestamp);
668d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
678d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
688d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    /**
698d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * Create a {@link Builder} for updating a {@link Voicemail}.
708d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * <p>
718d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * Only the id of the voicemail to be updated is mandatory.
728d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     */
738d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public static Builder createForUpdate(long id) {
748d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return new Builder().setId(id);
758d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
768d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
778d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    /**
788d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * Create a {@link Builder} for a new {@link Voicemail}, such as one suitable for returning from
798d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * a list of results or creating from scratch.
808d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     */
818d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public static Builder createEmptyBuilder() {
828d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return new Builder();
838d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
848d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
858d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    /**
868d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * Builder pattern for creating a {@link VoicemailImpl}.
878d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * <p>
888d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     * All fields are optional, and can be set with the various {@code setXXX} methods.
89c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee     * <p>
90c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee     * This class is <b>not thread safe</b>
918d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee     */
928d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public static class Builder {
938d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private Long mBuilderTimestamp;
948d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private String mBuilderNumber;
958d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private Long mBuilderId;
968d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private Long mBuilderDuration;
97c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee        private String mBuilderSourcePackage;
98c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee        private String mBuilderSourceData;
998d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private Uri mBuilderUri;
1008d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private Boolean mBuilderIsRead;
1018d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private boolean mBuilderHasContent;
1028d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1038d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        /** You should use the correct factory method to construct a builder. */
1048d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        private Builder() {
1058d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1068d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1078d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public Builder setNumber(String number) {
1088d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            mBuilderNumber = number;
1098d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1108d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1118d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1128d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public Builder setTimestamp(long timestamp) {
1138d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            mBuilderTimestamp = timestamp;
1148d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1158d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1168d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1178d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public Builder setId(long id) {
1188d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            mBuilderId = id;
1198d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1208d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1218d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1228d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public Builder setDuration(long duration) {
1238d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            mBuilderDuration = duration;
1248d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1258d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1268d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
127c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee        public Builder setSourcePackage(String sourcePackage) {
128c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee            mBuilderSourcePackage = sourcePackage;
1298d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1308d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1318d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
132c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee        public Builder setSourceData(String sourceData) {
133c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee            mBuilderSourceData = sourceData;
1348d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1358d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1368d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1378d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public Builder setUri(Uri uri) {
1388d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            mBuilderUri = uri;
1398d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1408d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1418d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1428d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public Builder setIsRead(boolean isRead) {
1438d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            mBuilderIsRead = isRead;
1448d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1458d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1468d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1478d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public Builder setHasContent(boolean hasContent) {
1488d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            mBuilderHasContent = hasContent;
1498d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return this;
1508d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1518d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1528d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        public VoicemailImpl build() {
1538d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee            return new VoicemailImpl(mBuilderTimestamp, mBuilderNumber, mBuilderId,
1548d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee                    mBuilderDuration,
155d407959adae53bdf1cfec3916441759506a43ba7Debashish Chatterjee                    mBuilderSourcePackage, mBuilderSourceData, mBuilderUri,
1568d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee                    mBuilderIsRead,
1578d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee                    mBuilderHasContent);
1588d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        }
1598d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1608d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1618d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1628d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public long getId() {
1638d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return hasId() ? mId : -1;
1648d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1658d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1668d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1678d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean hasId() {
1688d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mId != null;
1698d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1708d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1718d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1728d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public String getNumber() {
1738d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mNumber;
1748d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1758d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1768d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1778d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean hasNumber() {
1788d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mNumber != null;
1798d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1808d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1818d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1828d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public long getTimestampMillis() {
1838d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return hasTimestampMillis() ? mTimestamp : 0;
1848d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1858d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1868d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1878d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean hasTimestampMillis() {
1888d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mTimestamp != null;
1898d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1908d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1918d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1928d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public long getDuration() {
1938d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return hasDuration() ? mDuration : 0;
1948d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
1958d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
1968d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
1978d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean hasDuration() {
1988d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mDuration != null;
1998d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2008d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2018d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
202c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee    public String getSourcePackage() {
2038d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mSource;
2048d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2058d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2068d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
207c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee    public boolean hasSourcePackage() {
2088d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mSource != null;
2098d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2108d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2118d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
212c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee    public String getSourceData() {
2138d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mProviderData;
2148d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2158d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2168d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
217c635aaacffbfa695f479fe0aadeeee769224d14eDebashish Chatterjee    public boolean hasSourceData() {
2188d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mProviderData != null;
2198d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2208d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2218d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
2228d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public Uri getUri() {
2238d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mUri;
2248d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2258d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2268d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
2278d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean hasUri() {
2288d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mUri != null;
2298d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2308d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2318d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
2328d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean isRead() {
2338d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return hasRead() ? mIsRead : false;
2348d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2358d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2368d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
2378d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean hasRead() {
2388d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mIsRead != null;
2398d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2408d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2418d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
2428d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public boolean hasContent() {
2438d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return mHasContent;
2448d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2458d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee
2468d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    @Override
2478d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    public String toString() {
2488d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee        return "VoicemailImpl [mTimestamp=" + mTimestamp + ", mNumber=" + mNumber + ", mId=" + mId
2498d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee                + ", mDuration=" + mDuration + ", mSource=" + mSource + ", mProviderData="
250d407959adae53bdf1cfec3916441759506a43ba7Debashish Chatterjee                + mProviderData + ", mUri=" + mUri + ", mIsRead=" + mIsRead + ", mHasContent="
251d407959adae53bdf1cfec3916441759506a43ba7Debashish Chatterjee                + mHasContent + "]";
2528d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee    }
2538d6d2581ff11ec169cd84a6610557b9afdf41e06Debashish Chatterjee}
254