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