Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *     http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.example.android.voicemail.common.core;
     18 
     19 import android.net.Uri;
     20 
     21 /**
     22  * A simple immutable data object to represent a voicemail.
     23  */
     24 public final class VoicemailImpl implements Voicemail {
     25     private final Long mTimestamp;
     26     private final String mNumber;
     27     private final Long mId;
     28     private final Long mDuration;
     29     private final String mSource;
     30     private final String mProviderData;
     31     private final Uri mUri;
     32     private final Boolean mIsRead;
     33     private final boolean mHasContent;
     34 
     35     // TODO: 5. We should probably consider changing "number" everywhere to "contact", given that
     36     // it's not clear that these will be restricted to telephone numbers.
     37 
     38     private VoicemailImpl(
     39             Long timestamp,
     40             String number,
     41             Long id,
     42             Long duration,
     43             String source,
     44             String providerData,
     45             Uri uri,
     46             Boolean isRead,
     47             boolean hasContent) {
     48         mId = id;
     49         mNumber = number;
     50         mDuration = duration;
     51         mTimestamp = timestamp;
     52         mSource = source;
     53         mProviderData = providerData;
     54         mUri = uri;
     55         mIsRead = isRead;
     56         mHasContent = hasContent;
     57     }
     58 
     59     /**
     60      * Create a {@link Builder} for a new {@link Voicemail} to be inserted.
     61      * <p>
     62      * The number and the timestamp are mandatory for insertion.
     63      */
     64     public static Builder createForInsertion(long timestamp, String number) {
     65         return new Builder().setNumber(number).setTimestamp(timestamp);
     66     }
     67 
     68     /**
     69      * Create a {@link Builder} for updating a {@link Voicemail}.
     70      * <p>
     71      * Only the id of the voicemail to be updated is mandatory.
     72      */
     73     public static Builder createForUpdate(long id) {
     74         return new Builder().setId(id);
     75     }
     76 
     77     /**
     78      * Create a {@link Builder} for a new {@link Voicemail}, such as one suitable for returning from
     79      * a list of results or creating from scratch.
     80      */
     81     public static Builder createEmptyBuilder() {
     82         return new Builder();
     83     }
     84 
     85     /**
     86      * Builder pattern for creating a {@link VoicemailImpl}.
     87      * <p>
     88      * All fields are optional, and can be set with the various {@code setXXX} methods.
     89      * <p>
     90      * This class is <b>not thread safe</b>
     91      */
     92     public static class Builder {
     93         private Long mBuilderTimestamp;
     94         private String mBuilderNumber;
     95         private Long mBuilderId;
     96         private Long mBuilderDuration;
     97         private String mBuilderSourcePackage;
     98         private String mBuilderSourceData;
     99         private Uri mBuilderUri;
    100         private Boolean mBuilderIsRead;
    101         private boolean mBuilderHasContent;
    102 
    103         /** You should use the correct factory method to construct a builder. */
    104         private Builder() {
    105         }
    106 
    107         public Builder setNumber(String number) {
    108             mBuilderNumber = number;
    109             return this;
    110         }
    111 
    112         public Builder setTimestamp(long timestamp) {
    113             mBuilderTimestamp = timestamp;
    114             return this;
    115         }
    116 
    117         public Builder setId(long id) {
    118             mBuilderId = id;
    119             return this;
    120         }
    121 
    122         public Builder setDuration(long duration) {
    123             mBuilderDuration = duration;
    124             return this;
    125         }
    126 
    127         public Builder setSourcePackage(String sourcePackage) {
    128             mBuilderSourcePackage = sourcePackage;
    129             return this;
    130         }
    131 
    132         public Builder setSourceData(String sourceData) {
    133             mBuilderSourceData = sourceData;
    134             return this;
    135         }
    136 
    137         public Builder setUri(Uri uri) {
    138             mBuilderUri = uri;
    139             return this;
    140         }
    141 
    142         public Builder setIsRead(boolean isRead) {
    143             mBuilderIsRead = isRead;
    144             return this;
    145         }
    146 
    147         public Builder setHasContent(boolean hasContent) {
    148             mBuilderHasContent = hasContent;
    149             return this;
    150         }
    151 
    152         public VoicemailImpl build() {
    153             return new VoicemailImpl(mBuilderTimestamp, mBuilderNumber, mBuilderId,
    154                     mBuilderDuration,
    155                     mBuilderSourcePackage, mBuilderSourceData, mBuilderUri,
    156                     mBuilderIsRead,
    157                     mBuilderHasContent);
    158         }
    159     }
    160 
    161     @Override
    162     public long getId() {
    163         return hasId() ? mId : -1;
    164     }
    165 
    166     @Override
    167     public boolean hasId() {
    168         return mId != null;
    169     }
    170 
    171     @Override
    172     public String getNumber() {
    173         return mNumber;
    174     }
    175 
    176     @Override
    177     public boolean hasNumber() {
    178         return mNumber != null;
    179     }
    180 
    181     @Override
    182     public long getTimestampMillis() {
    183         return hasTimestampMillis() ? mTimestamp : 0;
    184     }
    185 
    186     @Override
    187     public boolean hasTimestampMillis() {
    188         return mTimestamp != null;
    189     }
    190 
    191     @Override
    192     public long getDuration() {
    193         return hasDuration() ? mDuration : 0;
    194     }
    195 
    196     @Override
    197     public boolean hasDuration() {
    198         return mDuration != null;
    199     }
    200 
    201     @Override
    202     public String getSourcePackage() {
    203         return mSource;
    204     }
    205 
    206     @Override
    207     public boolean hasSourcePackage() {
    208         return mSource != null;
    209     }
    210 
    211     @Override
    212     public String getSourceData() {
    213         return mProviderData;
    214     }
    215 
    216     @Override
    217     public boolean hasSourceData() {
    218         return mProviderData != null;
    219     }
    220 
    221     @Override
    222     public Uri getUri() {
    223         return mUri;
    224     }
    225 
    226     @Override
    227     public boolean hasUri() {
    228         return mUri != null;
    229     }
    230 
    231     @Override
    232     public boolean isRead() {
    233         return hasRead() ? mIsRead : false;
    234     }
    235 
    236     @Override
    237     public boolean hasRead() {
    238         return mIsRead != null;
    239     }
    240 
    241     @Override
    242     public boolean hasContent() {
    243         return mHasContent;
    244     }
    245 
    246     @Override
    247     public String toString() {
    248         return "VoicemailImpl [mTimestamp=" + mTimestamp + ", mNumber=" + mNumber + ", mId=" + mId
    249                 + ", mDuration=" + mDuration + ", mSource=" + mSource + ", mProviderData="
    250                 + mProviderData + ", mUri=" + mUri + ", mIsRead=" + mIsRead + ", mHasContent="
    251                 + mHasContent + "]";
    252     }
    253 }
    254